2

次のデータセットがあります

Date            Field1        Col1  Col2    Col3
2012/07/02      Customer1      CL   DS      RT
2012/07/03      Customer1      DS   RT      700
2012/07/04      Customer1      DS   RT      700
2012/07/02      Customer2      CL   DS      RT
2012/07/03      Customer2      DS   RT      1500
2012/07/04      Customer2      DS   RT      1500
2012/07/02      Customer3      CL   DS      RT
2012/07/03      Customer3      DS   RT      6000
2012/07/04      Customer3      DS   RT      6000
2012/07/02      Customer4      CL   RC      RT
2012/07/03      Customer4      RC   RT      4900
2012/07/04      Customer4      RC   RT      4900

次のように出力したいと思います。

Field1  2012/07/02  2012/07/03  2012/07/04
Col1    Customer1   CL  DS  DS
Col2    Customer1   DS  RT  RT
Col3    Customer1   RT  700 700
Col1    Customer2   CL  DS  DS
Col2    Customer2   DS  RT  RT
Col3    Customer2   RT  1500    1500
Col1    Customer3   CL  DS  DS
Col2    Customer3   DS  RT  RT
Col3    Customer3   RT  6000    6000
Col1    Customer4   CL  RC  RC
Col2    Customer4   RC  RT  RT
Col3    Customer4   RT  4900    4900

問題は、固定されていない顧客数 (Field1) と固定されていない日付数があることです。

4

3 に答える 3

3

あなたがやろうとしていることは、 として知られていPIVOTます。これらを行うには 2 つの方法があります。変換するすべての値をハードコーディングする静的ピボットと、実行時に値が決定される動的ピボットのいずれかです。

静的バージョン ( SQL Fiddle with Demoを参照):

select *
from 
(
  select dt, field1, col, value
  from yourTable
  unpivot
  (
    value for col in (col1, col2, col3)
  ) u
)x1
pivot
(
  min(value)
  for dt in ([2012-07-02], [2012-07-03], [2012-07-04])
) p

動的ピボット ( SQL Fiddle with Demoを参照):

DECLARE @colsUnpivot AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX),
    @colsPivot as  NVARCHAR(MAX)

select @colsUnpivot = stuff((select ','+quotename(C.name)
         from sys.columns as C
         where C.object_id = object_id('yourTable') and
               C.name like 'col%'
         for xml path('')), 1, 1, '')

select @colsPivot = STUFF((SELECT distinct ', ' + QUOTENAME(convert(char(10), dt, 120))
                    from yourTable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 
          'SELECT col, field1, ' + +@colsPivot+ '
           FROM
           (
              select dt, field1, col, value
              from yourTable
              unpivot
              (
                value for col in ('+ @colsUnpivot+')
              ) u
           )x1
           pivot
           (
             min(value)
             for dt in ('+@colsPivot+')
           ) p '

exec(@query)

動的ピボットは、列に変換する必要があるアイテムの数がわからない場合に最適なオプションです。どちらも同じ結果になります。

編集#1、日付列を特定の順序(descなど)にしたい場合は、次を使用して日付を取得します(SQL Fiddle with Demoを参照):

select @colsPivot = STUFF((SELECT ', ' + QUOTENAME(convert(char(10), dt, 120))
                    from yourTable
                    group by dt
                    ORDER by dt desc
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')
于 2012-08-27T11:50:54.797 に答える
0

質問にはSQLServerピボットクエリを使用する必要があります。

以下のクエリを使用できます:

CREATE TABLE mytable(date DATE, Field1 NVARCHAR(50), col1 NVARCHAR(30), col2 NVARCHAR(30),col3 NVARCHAR(30))
INSERT INTO mytable(date,Field1,col1,col2,col3)
VALUES('2012/07/02','Customer1','CL','DS','RT')
...

SELECT Col, Field1, [2012/07/02],[2012/07/03],[2012/07/04]
FROM (SELECT Field1, 'Col1' AS Col, Date, Col1 AS ColVal
      FROM MyTable

      UNION ALL

      SELECT Field1, 'Col2' , Date, Col2 AS ColVal
      FROM MyTable

      UNION ALL 

      SELECT Field1, 'Col3' , Date, Col3 AS Col
      FROM MyTable
      )AS P
PIVOT (MIN(Colval) FOR Date IN ([2012/07/02],[2012/07/03],[2012/07/04])) AS Pvt
ORDER BY Field1, Col
于 2012-08-27T11:51:23.650 に答える
0

集計なしで実行する必要はありませんが、動的 SQL を使用して実行する必要があります。「SQL Dynamic Pivot」を検索すると、それに関する多くの投稿が見つかります。のような: SQL Server 動的 PIVOT クエリ?

ただし、SQL のクライアントは事前にどの列が作成されているかを知りたいため、クライアントでこれを行う方がよいでしょう。

于 2012-08-27T11:06:11.660 に答える