透视多列sql server

Posted

技术标签:

【中文标题】透视多列sql server【英文标题】:Pivot multiple columns sql server 【发布时间】:2015-03-18 14:03:08 【问题描述】:

我有一个存储的 proc / sql 返回数据表,如下所示:

today_date  prev_date   sales   Company     S  itmgrp   itemName    sales
3/16/2015   3/13/2015   Online  CompanyA    S1  Personal    P - D   -3391.17
3/16/2015   3/13/2015   Online  CompanyA    S1  Home    MIS - D 286.2294316
3/16/2015   3/13/2015   Online  CompanyA    S1  Home    M L - D 240.3000802
3/16/2015   3/13/2015   Online  CompanyA    S1  Home    P - D   -313.0786364
3/16/2015   3/13/2015   Online  CompanyA    S1  Home    M L - D -3096.968552
3/16/2015   3/13/2015   Online  CompanyA    S1  Home    P L - D -5567.942955
3/16/2015   3/13/2015   Online  CompanyA    S2  Home    PC  -8770.911724
3/16/2015   3/13/2015   Online  CompanyA    S3  Personal    PJ  -808.36
3/16/2015   3/13/2015   Online  CompanyA    S3  Home    PJ  -42800.9843
3/16/2015   3/13/2015   Online  CompanyA    S3  Home    PJ  1760.708018
3/16/2015   3/13/2015   Online  CompanyA    S4  Home    PGF - D -59011.18629
3/16/2015   3/13/2015   Online  CompanyA    S1  Home    P - D   -560.2475234

如何使用 SQL Server 的 PIVOT 获得以下格式的数据透视结果:

行:公司/项目组/项目名称 值:总和(销售额)

CompanyA    
 Personal   
   P - D    -3391.17
   PJ       -808.36
 Home   
   P - D    -873.3261597
   MIS - D  286.2294316
   M L - D  -2856.668472
   P L - D  -5567.942955
   PC       -8770.911724
   PJ       -41040.27628
   PGF - D  -59011.18629

我可以获得 Company/itemgroup/itemName 的不同值

到目前为止,我看到的所有示例似乎都是单列枢轴。

【问题讨论】:

即使您进行了编辑,我也不清楚您希望如何返回数据。 【参考方案1】:

您可以使用group by rollup 实现非常相似的功能,然后通过grouping_id() 进行过滤:

with x as (
select company, itmgrp, itemname, sum(sales_amt) as sales_amt, grouping_id(company) as company_gid, grouping_id(itmgrp) as itmgrp_gid, grouping_id(itemname) as itemname_gid
from #t
group by rollup(company, itmgrp, itemname)
)
select 
case when itmgrp_gid = 1 then company else null end,
case when itemname_gid = 1 then itmgrp else null end,
itemname,
case when company_gid + itmgrp_gid + itemname_gid = 0 then sales_amt else null end
from x
where company_gid + itmgrp_gid + itemname_gid < 3
order by company, itmgrp, itemname, company_gid, itmgrp_gid, itemname_gid

【讨论】:

grouping_id 不是 SQL Server 2008 的函数。 @buffer_overflow:I wouldn't be so sure。无论如何,您要做的是演示文稿问题。 SQL Server 应该只为您提供数据,它是应该进行格式化的表示层。通常这是报告工具的工作。

以上是关于透视多列sql server的主要内容,如果未能解决你的问题,请参考以下文章

具有多列聚合的 SQL Server 数据透视表

具有多列日期的 SQL Server 数据透视表

基于 SQL Server 中的一列透视多列

SQL查询对多列进行反透视和联合

动态 SQL 使用多列交叉应用来反透视数据

SQL Server 上多列查询的多列索引优化