24

MSSQLで次の転置を行う必要があります

から:

Day  A  B 
---------
Mon  1  2
Tue  3  4
Wed  5  6
Thu  7  8
Fri  9  0

次のように:

Value Mon Tue Wed Thu Fri 
--------------------------
A      1   3   5   7   9
B      2   4   6   8   0

PIVOT列が1つしかない場合(A)の方法は理解できますが、転置する列が複数ある場合(A、B、...)の方法がわかりません。

転置されるサンプルコード:

select LEFT(datename(dw,datetime),3) as DateWeek, 
  sum(ACalls) as A, 
  Sum(BCalls) as B 
from DataTable
group by LEFT(datename(dw,datetime),3)

テーブル構造:

Column DataType
DateTime Datetime
ACalls int
BCalls int

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

4

1 に答える 1

29

UNPIVOTデータを目的の結果に転置するには、と関数の両方を使用する必要がありPIVOTます。

このUNPIVOT関数はAと列Bを受け取り、結果を行に変換します。次に、PIVOT関数を使用してday値を列に変換します。

select *
from
(
  select day, col, value
  from yourtable
  unpivot
  (
    value
    for col in (A, B)
  ) unpiv
) src
pivot
(
  max(value)
  for day in (Mon, Tue, Wed, Thu, Fri)
) piv

SQL FiddlewithDemoを参照してください。

SQL Server 2008以降を使用している場合は、CROSS APPLYwithVALUESを使用してデータのピボットを解除できます。コードは次のように変更されます。

select *
from
(
  select day, col, value
  from yourtable
  cross apply
  (
    values ('A', A),('B', B)
  ) c (col, value)
) src
pivot
(
  max(value)
  for day in (Mon, Tue, Wed, Thu, Fri)
) piv

SQL FiddlewithDemoを参照してください。

#1を編集し、現在のクエリを上記のソリューションに適用すると、次のようなものが使用されます。

select *
from
(
  select LEFT(datename(dw,datetime),3) as DateWeek,
    col, 
    value
  from DataTable 
  cross apply 
  (
    values ('A', ACalls), ('B', BCalls)
  ) c (col, value)
) src
pivot
(
  sum(value)
  for dateweek in (Mon, Tue, Wed, Thu, Fri)
) piv
于 2013-03-08T15:48:21.580 に答える