1

次のようにテーブルをピボットする必要があります:最初のテーブルは次のようになります

GEO PRD PACK    DATATYPE    Sales1  Sales2

T1  P1  M1  22          1     2

T1  P1  M1  23          2     8

T1  P1  M1  24          3     5

T2  P2  M2  22          3     2

T2  P2  M2  23          1     4

T2  P2  M2  24          1     7

そして私が欲しいのは:

GEO PRD PACK 22_Sales1 22_Sales2 23_Sales1 23_Sales2 24_Sales1 24_Sales2

T1  P1  M1       1         2         2         8         3         5

T2  P2  M2       3         2         1         4         1         7

ここでは、個別のDATATYPEが固定されています:常に:22、23、24、それ以下でもそれ以上でもありません。

誰かが私に適切なクエリを書く方法を手伝ってもらえますか?

4

3 に答える 3

0

データでを使用PIVOTするには、次を使用します。これにより、UNPIVOT最初に実行され、次にaが実行PIVOTされて、必要な形式のデータが取得されます。

create table t1
(
    geo varchar(2),
    prd varchar(2),
    pack varchar(2),
    datatype int,
    sales1 int,
    sales2 int
)
insert into t1 values ('T1', 'P1', 'M1', 22, 1, 2)
insert into t1 values ('T1', 'P1', 'M1', 23, 2, 8)
insert into t1 values ('T1', 'P1', 'M1', 24, 3, 5)
insert into t1 values ('T2', 'P2', 'M2', 22, 3, 2)
insert into t1 values ('T2', 'P2', 'M2', 23, 1, 4)
insert into t1 values ('T2', 'P2', 'M2', 24, 1, 7)

select *
from 
(
    select geo, prd, pack, cast(datatype as varchar(5)) + '_' + col col,value
    from t1
    unpivot
    (
        value
        for col in (sales1, sales2)
    ) u
) x
pivot
(
    sum(value)
    for col in ([22_sales1], [22_sales2], [23_Sales1], [23_Sales2], [24_Sales1], [24_Sales2])
) p

SQL FiddlewithDemoを参照してください

于 2012-08-16T11:43:48.937 に答える
0
select geo, prd, pack,   
  sum(sales_22_1) sales_22_1,
  sum(sales_22_2) sales_22_2,
  sum(sales_23_1) sales_23_1,
  sum(sales_23_2) sales_23_2,
  sum(sales_24_1) sales_24_1, 
  sum(sales_24_2) sales_24_2 
from
(select geo, prd, pack, 
  (case when datatype = 22 then sales1
   else null
   end) as sales_22_1,
(case when datatype = 22 then sales2
   else null
   end) as sales_22_2,
(case when datatype = 23 then sales1
   else null
   end) as sales_23_1,
(case when datatype = 23 then sales2
   else null
   end) as sales_23_2,
(case when datatype = 24 then sales1
   else null
   end) as sales_24_1,
(case when datatype = 24 then sales2
   else null
   end) as sales_24_2
 from mytab)
group by geo, prd, pack

(使用可能なSQLサーバーインスタンスがないため、テストされていません)。

于 2011-06-06T09:43:53.913 に答える
0

最近のバージョンの SQL Server にはPIVOT 関数があります。

いくつかの SQL Server バージョンでピボットを行う方法の例を次に示します。

また、この非常に人気のある SO の質問に対する適切な回答が多数あります: SQL Server PIVOT の例は?

これは、単純なPIVOTステートメントがどのように見えるかのそのページの例です:

SELECT act AS 'Action', [View] as 'View', [Edit] as 'Edit'
FROM (
    SELECT act, cmd FROM data
) AS src
PIVOT (
    MAX(cmd) FOR cmd IN ([View], [Edit])
) AS pvt
于 2011-06-06T09:44:10.157 に答える