我读过关于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
店铺编号写在边上,星期写在上面。
Pivot是SQL操作符之一,用于将输出中的唯一数据从一列转换为多列。这也意味着将行转换为列(旋转表)。让我们考虑这张桌子,
如果我想根据每个客户的产品类型(扬声器、眼镜、耳机)过滤这些数据,那么使用Pivot操作符。
Select CustmerName, Speaker, Glass, Headset
from TblCustomer
Pivot
(
Sum(Price) for Product in ([Speaker],[Glass],[Headset])
) as PivotTable
我以前通过使用子查询实现了同样的目的。所以如果你原来的表叫做sto叙述byweek,你有一个单独的表列出商店id,然后它看起来像这样:
SELECT StoreID,
Week1=(SELECT ISNULL(SUM(xCount),0) FROM StoreCountsByWeek WHERE StoreCountsByWeek.StoreID=Store.StoreID AND Week=1),
Week2=(SELECT ISNULL(SUM(xCount),0) FROM StoreCountsByWeek WHERE StoreCountsByWeek.StoreID=Store.StoreID AND Week=2),
Week3=(SELECT ISNULL(SUM(xCount),0) FROM StoreCountsByWeek WHERE StoreCountsByWeek.StoreID=Store.StoreID AND Week=3)
FROM Store
ORDER BY StoreID
这种方法的一个优点是语法更清晰,并且更容易连接到其他表,将其他字段也拉到结果中。
我的轶事结果是,在不到一秒钟的时间内运行这个查询的几千行,实际上我有7个子查询。但是正如评论中所指出的,这样做的计算成本更高,所以如果您希望它在大量数据上运行,请谨慎使用此方法。
Pivot是SQL操作符之一,用于将输出中的唯一数据从一列转换为多列。这也意味着将行转换为列(旋转表)。让我们考虑这张桌子,
如果我想根据每个客户的产品类型(扬声器、眼镜、耳机)过滤这些数据,那么使用Pivot操作符。
Select CustmerName, Speaker, Glass, Headset
from TblCustomer
Pivot
(
Sum(Price) for Product in ([Speaker],[Glass],[Headset])
) as PivotTable