2011-06-06 40 views
1

我需要转动表如下: 初始表是这样的帮助中SQLSERVER没有汇总数据旋转所需的2008

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,不会少于等于。

请,谁能帮助我如何写正确的查询?

回答

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 Server实例)。

0

最新的SQL Server版本有旋转功能

如何在几个SQL Server版本做旋转Here is an example

而且有很多很好的回答这个非常受欢迎的,所以问题:SQL Server PIVOT examples?

这里是一个什么样的简单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 
+0

我怎么能在这里实现PIVOT? – tanvir80 2011-06-08 10:04:28

+0

从内部SELECT开始。确保你获得了正确的数据。外部的SELECT指定新的列。你可能不得不从小处着手,逐步建立你的SQL。 – DOK 2011-06-08 11:06:20

0

要使用PIVOT与你的数据你会使用以下。该执行UNPIVOT,然后再一个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 Fiddle with Demo