1

次のようなテーブル(SeekerInfo)が1つあります。

--------------------------------------------------
SeekerID -  SeekerName - SeekerSex - SeekerMobile
12121    -  mmmm       - Male      - 067676767
13223    -  ssss       - Female    - 078876767
--------------------------------------------------

そして、好きな別のテーブル(SeekerCources)(すべてのシーカーの最大値には3つのコースがあります):

--------------------------------------------------
SeekerID - CourceName - Duration
12121    - MCSA       - 1 year
12121    - MCPD       - 6 months
13223    - CCNA       - 1 year
13223    - CCNP       - 1 year
13223    - MCTS       - 4 months

2 つのテーブルからデータをプレビューする select ステートメントを次のようにしたいと考えています。

SeekerID -  SeekerName - SeekerSex - SeekerMobile - Cource1 - Cource2 - Cource3
12121    -  mmmm       - Male      - 067676767    - MCSA    - MCPD    - *NULL*
13223    -  ssss       - Female    - 078876767    - CCNA    - CCNP    - MCTS 
4

3 に答える 3

1

これは、各コースに 1 ~ 3 の番号を割り当ててから、3 つの結合を行うアプローチです。

WITH cte 
     AS (SELECT Row_number() OVER (partition BY SeekerID ORDER BY CourceName) rn 
                , 
                SeekerID, 
                CourceName, 
                Duration 
         FROM   SeekerCources) 
SELECT si.SeekerID, 
       si.SeekerName, 
       si.SeekerSex, 
       si.SeekerMobile, 
       c1.CourceName AS Cource1, 
       c2.CourceName AS Cource2, 
       c3.CourceName AS Cource3 
FROM   SeekerInfo si 
       LEFT JOIN cte c1 
         ON si.SeekerID = c1.SeekerID 
            AND c1.rn = 1 
       LEFT JOIN cte c2 
         ON si.SeekerID = c2.SeekerID 
            AND c2.rn = 2 
       LEFT JOIN cte c3 
         ON si.SeekerID = c3.SeekerID 
            AND c3.rn = 3 

デモ

未解決の問題の 1 つは、1、2、または 3 のコースを決定する良い方法がないことです。おそらく、日付のようなフィールドがある場合は、CourceName をそのフィールドに置き換えることができます。

例えば
Row_number() OVER (partition BY SeekerID ORDER BY DateTaken)

于 2012-04-27T17:17:26.807 に答える
1

長期的には多くの NULL 値を持つように見えます。つまり、遅かれ早かれ問題が発生することは間違いありません。また、n 個の属性 (n はコース結果の最大数) を結果に導入しようとしていますが、これはクライアント側での作業を容易にしません。

すべての結果を行として取得する別のアプローチをお勧めします。つまり、結果に重複データが含まれることになります (これは、保存していないため、実際には問題ではありません)。

SELECT i.*, c.CourseName 
FROM SeekerInfo i JOIN SeekerCourses c 
ON i.SeekerID = c.SeekerID;

これにより、追加のシーカー情報を含むすべてのコースが返されます;)

編集: 申し訳ありませんが、投稿を適切に読みませんでした。常に最大 3 つのコースがあります。それでも、おそらくこれはとにかく役立ちます。

于 2012-04-27T17:18:16.573 に答える