嗯,我想我真的很密集 . 我已经阅读了MS数据透视表上的内容,但我仍然遇到问题 . 我见过你们中的一些人似乎吃了这些东西,所以我只是决定注册并提出问题 .
我有一个正在创建的临时表,我们会说第1列是商店号,第2列是周数,最后第3列是某种类型的总和 . 周数也是动态的,商店数量是静态的 .
Store Week xCount
------- ---- ------
102 1 96
101 1 138
105 1 37
109 1 59
101 2 282
102 2 212
105 2 78
109 2 97
105 3 60
102 3 123
101 3 220
109 3 87
我希望它作为一个数据透视表出来,像这样:
Store 1 2 3 4 5 6....
-----
101 138 282 220
102 96 212 123
105 37
109
将数字存储在侧面,将数字存储在顶部 .
谢谢您的帮助 .
7 回答
如果您使用的是SQL Server 2005,则可以使用
PIVOT
函数将数据从行转换为列 .听起来你需要使用动态sql如果周未知,但最初使用硬编码版本更容易看到正确的代码 .
首先,这里有一些快速表定义和使用数据:
如果您的值已知,那么您将对查询进行硬编码:
见SQL Demo
然后,如果您需要动态生成周数,您的代码将是:
见SQL Demo .
动态版本,生成应转换为列的
week
数字列表 . 两者都给出了相同的结果:以上是对@Tayrn答案的修订,可能有助于您更轻松地理解旋转:
这可能不是最好的方法,但这有助于我围绕如何转动表格 .
ID =要转动的行
MY_KEY =您从原始表中选择的列,其中包含要转动的列名称 .
VAL =您希望在每列下返回的值 .
MAX(VAL)=>可以替换为其他聚合函数 . SUM(VAL),MIN(VAL),ETC ......
这是你可以做的:
DEMO
我正在编写一个可能对此有用的sp,基本上这个sp会旋转任何表并返回一个新的表,或仅返回数据集,这是执行它的方法:
please note 在参数@agg中,列名必须是
'['
,参数必须以逗号','
结尾SP
这是一个执行的例子:
然后
Select * From ##TEMPORAL1PVT
将返回:这是动态的周数 .
这里有完整的例子:SQL Dynamic Pivot
我之前通过使用子查询实现了同样的目标 . 因此,如果您的原始表名为StoreCountsByWeek,并且您有一个单独的表列出了商店ID,那么它将如下所示:
此方法的一个优点是语法更清晰,并且更容易连接到其他表以将其他字段拉入结果中 .
我的轶事结果是,在不到一秒的时间内完成了几千行的查询,我实际上有7个子查询 . 但正如评论中所指出的那样,以这种方式执行它的计算成本更高,因此如果您希望它运行在大量数据上,请小心使用此方法 .