2011-01-12 14 views
1

は、私はほとんど同じ質問をして、有効な作業答えを得た:SQL Server 2000 - クエリの最終結果で結合の結果をどのようにローテーションするのですか? (2+結果)

Previous Question

その問題の答えは私の中に特殊なケースでは動作しない可能ここではマイナーな変更はありデータベース。私が前の記事でこれを述べたので、すべての状況で、TableBに最大2つの可能なエントリしか存在しないと考えてください。私の問題は、これが成立しないケースが1つあります。私はTableBで最大5項目を処理する必要があります。 - 私が知っていれば、私は元の投稿に追加されて申し訳ありません。

元の問題を解決するためにMINとMAXを使用しているため、私が今実行している2つ以上の項目の状況について前の回答を修正する方法はわかりません。

これはSQL Server 2000サーバーで使用されます。

情報列の順序はまったく重要ではありません。

TableAの

ID | Name 
---+------ 
1 | John 
2 | Jane 
3 | Bob 
4 | Doug 
5 | Smith 

TableBの

ID | NameID | Information 
---+--------+------------ 
1 | 1 | Apples 
2 | 1 | Apples 
3 | 2 | Pears 
4 | 2 | Grapes 
5 | 3 | Kiwi 
6 | 5 | Apples 
7 | 5 | Pears 
8 | 5 | Grapes 
9 | 5 | Kiwi 
10| 5 | Kumkwat 

望ましい結果

ID | Name | InformationA | InformationB | InformationC | InformationD | InformationE 
---+------+--------------+--------------+--------------+--------------+------------- 
1 | John | Apples  | Apples  | NULL   | NULL   | NULL   
2 | Jane | Pears  | Grapes  | NULL   | NULL   | NULL   
3 | Bob | Kiwi   | NULL   | NULL   | NULL   | NULL   
4 | Doug | NULL   | NULL   | NULL   | NULL   | NULL   
5 | Smith| Apples  | Pears  | Grapes  | Kiwi   | Kumkwat 

答えて

0

row_numberが使用可能であった場合、これは、より効率的/ずっと容易になるだろう!

SELECT Id, 
     Name, 
     MAX (CASE WHEN idx=0 THEN Information END) AS InformationA , 
     MAX (CASE WHEN idx=1 THEN Information END) AS InformationB , 
     MAX (CASE WHEN idx=2 THEN Information END) AS InformationC , 
     MAX (CASE WHEN idx=3 THEN Information END) AS InformationD , 
     MAX (CASE WHEN idx=4 THEN Information END) AS InformationE 
FROM (SELECT a.Id, 
       a.Name, 
       b.Information, 
       COUNT(b2.Id) idx 
     FROM TableA a 
       LEFT JOIN TableB b 
       ON a.Id = b.NameId 
       LEFT JOIN TableB b2 
       on b.NameId = b2.NameId 
        and b2.Id < b.Id 
     GROUP BY a.Id, 
        a.Name, 
        b.Id, 
        b.Information) derived 
GROUP BY Id, 
      Name 
+0

ありがとうございました。 – Justin808

関連する問題