0

私は次のようなテーブルを持っています

Customer_id     Order_id   Action    Time_Stamp
abc             123         placed     8/1/2012 10:00AM
abc             123         processed  8/1/2012 10:30AM
abc             123         shipped    8/1/2012 11:00AM

xyz             456         recieved   8/1/12 12:00PM 

私が取得しようとしているのは

Customer ID     Order_id   Placed             Processed           Shipped            recieved
abc              123       8/1/2012 10:00Am    8/1/2012 10:30AM   8/1/2012 11:00AM   null
xyz              456       null                null               null               8/1/2012 12:00PM

クエリが簡単になる場合に必要な列の最大数(つまり、アクションの数)を知っています。

どんな助けでも大歓迎です。

4

2 に答える 2

4

PIVOTこのタイプのクエリにはを使用できます。

SELECT *
FROM 
(
    SELECT Customer_id, Order_id, Action, Time_Stamp
    FROM yourTable
) x
PIVOT
(
   max(Time_Stamp)
   for action in ([Placed], [Processed], [Shipped], [received])
) p

SQL FiddlewithDemoを参照してください

上記のクエリは、作成する列の値がわかっている場合にうまく機能します。ただし、そうでない場合は、動的ピボットを使用できます。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(action) 
                    from test
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query 
      = 'SELECT Customer_id, Order_id,' + @cols + ' from 
         (
            select Customer_id, Order_id, Action, Time_Stamp
            from test
         ) x
         pivot 
         (
            max(Time_Stamp)
             for action in(' + @cols + ')
         ) p '

execute(@query)

SQL FiddlewithDemoを参照してください

于 2012-08-21T20:04:36.537 に答える
0

注文ごとに複数の状態ではなく、状態の修正セットが期待される場合は、次のようなものが機能する可能性があります。

SELECT customer_id, order_id
      ,MIN(CASE WHEN action = 'placed' THEN time_stamp ELSE NULL END) AS placed
      ,MIN(CASE WHEN action = 'processed' THEN time_stamp ELSE NULL END) AS processed
      ,MIN(CASE WHEN action = 'shipped' THEN time_stamp ELSE NULL END) AS shipped
      ,MIN(CASE WHEN action = 'received' THEN time_stamp ELSE NULL END) AS received
  FROM activity
  GROUP BY customer_id, order_id
于 2012-08-21T20:10:57.490 に答える