0

我有以下数据。

state    f_name     product     paymonth     income     expense     savings
state_1  f1         product_1   apr-2013     5000       1500        3500
state_1  f1         procudt_1   may-2013     4500       3000        1500
state_1  f1         procudt_2   may-2013     4500       3000        1500
state_2  f2         product_2   apr-2013     15000      11500       35000
state_2  f2         product_3   aug-2013     1500       500         1000

使用这样的标题在 paymonth 列上进行透视,这是所需的结果......

state    f_name   product    apr-2013_income   apr-2013_expense   apr-2013_savings   may-2013_income   may-2013_expense.....and so on for distinct paymonth
state_1  f1       product_1  5000              1500               3500               4500              3000....and so on....
state_1  f1       product_2  0                 0                  0                  4500              3000....

现在,真正的问题是 state、f_name 和 products 必须保留为列并且它们是动态的。

paymonth 和其他数据也是动态的。

需要使用枢轴。我用谷歌搜索了一些例子,但没有得到我想要的。

这是我尝试过的...

DECLARE @COLS AS NVARCHAR(MAX) = ''

SELECT @COLS = COALESCE(@COLS + ', ', '') + QUOTENAME(PAYMONTH)
FROM #DATA
GROUP BY PAYMONTH, PM ORDER BY PM --pm is last date of paymonth for ordering data in asc/desc

declare @QUERY AS NVARCHAR(MAX) = ''

SET @QUERY = 'SELECT state, product, f_name, ' + @COLS + ' FROM
(
    SELECT state, product, f_name, income, paymonth--, expense, saving,
    FROM #DATA
) X
PIVOT
(
         SUM(income)
         FOR paymonth IN (' + @COLS + ')
) P
ORDER BY state, product, f_name'
execute(@query)

这将为收入支付月的支点提供正确的结果,但我不能对所有 3 个收入、费用和储蓄都做到这一点。

尝试过交叉应用和反透视,但失败了。

在这方面需要帮助。谢谢。

4

1 回答 1

1

您的问题是源表的非规范化结构。与往常一样,这会导致查询困难。

如果您使用 对其进行标准化unpivot,那么下一个枢轴相对简单......

select * 
from 
(
     select state,f_name,product, cost, paymonth+'_' +paytype as pp from #data
    unpivot (cost  for paytype in (income, expense, savings)) u
) up
pivot (sum(cost) for pp in 
    ([apr-2013_income],[apr-2013_expense],[apr-2013_savings],[may-2013_income] --, ....
    )
) p

从中构造动态 SQL 留给读者作为练习。

于 2013-10-21T07:31:52.070 回答