动态列-SQL Server-月作为列

动态列-SQL Server-月作为列,第1张

动态列-SQL Server-月作为列

您的数据已经被旋转,但是需要在另一个层次上旋转。我认为处理此问题的最佳方法是先取消枢转,然后再处理正确的枢轴水平。

第1步:取消枢纽

您可以使用SQL 2005 UNPIVOT命令,或使用CROSS
JOIN技术。这是两个例子。请注意,为了使事情简单,我在中间花了几个月的时间。只需添加它们即可。

-- CROSS JOIN method (also works in SQL 2000)SELECt   P.Project,   Mo =      DateAdd(mm,         X.MonthNum,         DateAdd(yy, P.[Year] - 1900, '19000101')      ),   Amount =       CASE X.MonthNum         WHEN 0 THEN Jan         WHEN 1 THEN Feb         WHEN 11 THEN Dec      ENDFROM   ProjectData P   CROSS JOIN (      SELECt 0 UNIOn ALL SELECT 1 UNIOn ALL SELECT 11   ) X (MonthNum)

每行重复12次,然后CASE语句仅对每一行拉出一个月的数据,从而使数据保持不变。

-- UNPIVOT methodSELECT    P.Project,    Mo =       DateAdd(mm,          Convert(int, P.MonthNum),          DateAdd(yy, P.[Year] - 1900, '19000101')       ),    P.AmountFROM   (      SELECt Project, [Year], [0] = Jan, [1] = Feb, [11] = Dec      FROM ProjectData   ) X UNPIVOT (Amount FOR MonthNum IN ([0], [1], [11])) PDROP TABLE ProjectData

两种方法都不总是始终都能胜出。有时,一种方法的效果要优于另一种方法(取决于数据透视)。UNPIVOT方法在执行计划中使用CROSS JOIN不使用的筛选器。

步骤2:再次旋转

现在,如何使用未透视的数据。您没有说您的 将如何使用它,但是由于您需要将数据放入某种输出文件中,因此我建议使用SQL Server
2005附带的SSRS(Sql Server Reporting Services)。额外费用。

只需使用Matrix报表对象来枢转上面的查询之一。这个对象很高兴地确定在报表运行时将数据值放入列标签中的过程,听起来确实像您所需要的那样。如果添加的列完全按照您的喜好格式化日期,则可以按Mo列进行排序,但可以使用新的表达式作为列标签。

SSRS还具有多种可用的格式和计划选项。例如,您可以让它通过电子邮件发送Excel文件或将网页保存到文件共享。

如果我遗漏了任何东西,请告诉我。

对于想查看上面的代码的人,这里有一些创建脚本供您使用:

USE tempdbCREATE TABLE ProjectData (    Project varchar(10),    [Year] int,    Jan decimal(15, 2),    Feb decimal(15, 2),    Dec decimal(15, 2))SET NOCOUNT onINSERT ProjectData VALUES ('11-11079', 2008, 0.0, 0.0, 75244.90)INSERT ProjectData VALUES ('11-11079', 2009, 466.0, 0.0, 0.0)INSERT ProjectData VALUES ('11-11079', 2010, 855.0, 0.0, 0.0)INSERT ProjectData VALUES ('01-11052', 2009, 56131.0, 0.0, 0.0)


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5021325.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-15

发表评论

登录后才能评论

评论列表(0条)

保存