3

SQL Server 2008 データベースに次のテーブルがあります。

MsgID    TrackerId    MsgContent

  1        123           red    //MsgContent corresponding to colour
  2        123          E2120   //MsgContent corresponding to model
  5        123           sam    //MsgContent corresponding to password
  1        111          orange  //MsgContent corresponding to colour
  2        111          M3420   //MsgContent corresponding to model
  5        111           pam    //MsgContent corresponding to password

結果が次のような単一のクエリが必要です。

TrackerId     Colour    Model    Password   

  123          red      E2120       sam
  111          orange   M3420       pam 

では、この問題を解決するにはどうすればよいでしょうか。前もって感謝します。

4

4 に答える 4

2

を使ったバージョンPIVOTです。これに関する私の唯一の問題は、不要な集計関数です。あなたのテーブル定義はわかりませんが、列 MsgID、TrackerID、MsgContent しかない場合、ピボットするグループ化、展開、および集計列を選択する CTE は不要です。より多くの列がある場合は、CTE を保持してください。そうしないと、結果に null 値が表示されます。

SELECT TrackerID, [1] [Colour], [2] [Model], [5] [Password]
FROM 
(
  SELECT 
    MsgID, -- spreading column
    TrackerID, -- grouping column
    MsgContent -- aggregation column
  FROM Trackers
) p
PIVOT
(
  MAX(MsgContent)
  FOR MsgID IN( [1], [2], [5] )
) AS pvt

SQLフィドル

値のタイプごとに選択を使用することもできます。

SELECT DISTINCT TrackerID,
  (SELECT MsgContent FROM trackers t2 
   WHERE t2.MsgID = 1 AND t2.TrackerID = t1.TrackerID) [Colour],
  (SELECT MsgContent FROM trackers t2 
   WHERE t2.MsgID = 2 AND t2.TrackerID = t1.TrackerID) [Model],
  (SELECT MsgContent FROM trackers t2 
   WHERE t2.MsgID = 5 AND t2.TrackerID = t1.TrackerID) [Password]
FROM Trackers t1

SQLフィドル

于 2013-07-24T14:53:26.680 に答える
0
Select [TrackerId],[1] AS Color,[2] as Model,[5] AS [Password]
FROM 
    (SELECT [TrackerId], [MsgID], MAX([MsgContent]) as [MsgContent]
    FROM Table1
    GROUP BY [TrackerId], [MsgID]
    )x
    PIVOT
    (
        MAX([MsgContent])
        FOR [MsgID] IN ([1],[2],[5])
    )p

SQLフィドル

于 2013-07-24T15:04:40.723 に答える