2017-09-03 48 views
-2

我有一个表结构如下SQL选择上组数据

Name  Data  Month 
A   100  2016-01 
A   120  2016-03 
A   120  2016-04 
A   150  2016-05 
B   100  2016-03 

我怎样才能让最终的结果开始月份和结束月份例如下面之间成为如果可能的话,2016-01至2016-05使用SQL?

Name  2016-01 2016-02 2016-03  2016-04  2016-05 
A   100  0   120   120  150 
B   0   0   100   0   0 

我做了一些实验,但无法做到这一点。这是我曾尝试

select * 
from 
(
    select id, isnull(price,0), [PERIOD] 
    from price_table 
) a 
pivot 
(
    max(price) 
    for [PERIOD] in ([2010-01-01],[2010-02-01]) 
) p 

有错误“消息8155,级别16,状态2码,10号线 没有列名是为‘A’。第2栏指明 消息207,级别16,状态1,行12 列名'价格'无效。“

也请注意,开始月,结束月份是可变的我的查询,该月将动态添加更多的也不是真正2016-01至2016-05

+1

什么SQL数据库您使用的? MySQL的? SQL Server? PostgreSQL的?它会影响答案。另外,你所要求的具体是如何*数据*即数据行到列。 –

+0

您好我正在使用SQL Server,我也尝试使用数据透视表,但似乎不能使它的工作,特别是我想使“空”数据的月份变为0 – onegun

+0

您可以使用'isnull(,0)'来处理这个或'CASE'陈述。您必须将其应用于每个旋转的列。假设您期望它为每个月动态添加更多列? –

回答

2

根据你的样本数据,枢轴查询将低于

SELECT name, 
     ISNULL([2016-01],0) [2016-01], 
     ISNULL([2016-02],0) [2016-02], 
     ISNULL([2016-03],0) [2016-03], 
     ISNULL([2016-04],0) [2016-04], 
     ISNULL([2016-05],0) [2016-05] 
    FROM t_data 
PIVOT (SUM(data) 
     FOR [month] IN ([2016-01], [2016-02], [2016-03], [2016-04], [2016-05]) 
     ) p 

结果

name 2016-01 2016-02 2016-03 2016-04 2016-05 
A  100  0  120  120  150 
B  0  0  100  0  0 
+0

我觉得这个答案在“SELECT name, ISNULL([2016-01],0)[2016-01]有点硬编码”我的月份在数据库中是可变的,它可能不是2016-01 – onegun