【发布时间】:2016-02-25 14:49:21
【问题描述】:
我已经设法为自己构建了一个漂亮的小 T-SQL 语句,它将调度信息转变成每月的列。
SELECT *
FROM
(
SELECT
t1.customer_code,
t1.part_number,
LEFT(DATENAME(month, [formatted_date]),3) as [Month],
t1.quantity as [quantity] FROM FORECAST_VIEW as t1
where
quantity <> 0
and formatted_date >= DATEADD(month, DATEDIFF(month, 0, GETDATE()), 0)
) as p
pivot
(
sum(quantity)
for [Month] in (Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec)
) as p
order by customer_code, part_number
这会产生带有列的输出
customer_code, part_number, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec
并汇总每个月所需的 part_number 数量。
这很好用,并且在报告中产生了奇迹,但是如果我可以让月份列从当前月份开始并按顺序排列 12 个月,那么这将是锦上添花。
问题是我不知道该怎么做。
如果我今天运行它,输出将是
customer_code, part_number, Nov, Dec, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct
有人有什么建议吗?
谢谢
编辑 我刚刚想到的事情,如果我找不到解决方案但它很难看,我不会排除。 我可以将整个 T-SQL 语句放在一个 IF 块中
IF LEFT(DATENAME(month, GETDATE()),3) = 'Nov'
BEGIN
SELECT *
FROM
(
...
) as p
pivot
( sum(quantity)
for [Month] in (Nov, Dec, Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct)
) as p
order by customer_code, part_number
END
重复 12 次并调整基准月份。
【问题讨论】:
-
您可以转入 datediff(m..) 列 (m0 .. m11) 并在客户端使列标题动态化(并填写正确的月份名称)。或者,如果您需要具有正确列名的 SQL 结果,则必须执行动态 SQL(在存储过程中)。
标签: sql-server database tsql pivot