我想根据 SSMS (SQL Server) 中的源表在我的数据库中创建一个视图表。 但要获得想要的视图表格式非常困难。
这里我展示一个源表的例子。
国家 | 销售日期 | 销售代码 | 类型_项目 | 销售 |
---|---|---|---|---|
阿尔及利亚 | 2024年6月1日 | 实际 | 帽子 | 200 |
阿尔及利亚 | 2024年6月1日 | 实际 | 衬衫 | 145 |
阿尔及利亚 | 2024年6月1日 | 实际 | 裤子 | 150 |
阿尔及利亚 | 2024年6月1日 | 目标 | 帽子 | 90 |
阿尔及利亚 | 2024年6月1日 | 目标 | 衬衫 | 500 |
阿尔及利亚 | 2024年6月1日 | 目标 | 裤子 | 100 |
这是我希望如何显示我的表格:
国家 | 销售日期 | hat_sales_ACTUAL | hat_sales_TARGET | 衬衫_销售额_实际 | 衬衫销售_目标 | 裤子_销售额_实际 | 裤子_销售_目标 |
---|---|---|---|---|---|---|---|
阿尔及利亚 | 2024年6月1日 | 200 | 90 | 145 | 500 | 150 | 100 |
我确实尝试过使用连接,但似乎很难做到正确。
是的,有很多使用 PIVOT 的示例,但大多数都没有展示如何使用像
sales_code, type_item
这样包含多个列的枢轴,而且答案并不明显。
由于 PIVOT 不允许在
FOR
子句中引用多个列,因此您必须提前计算组合列值。这可以通过将 CONCAT()
计算总结为 CROSS APPLY
来完成。
结果会是这样的:
-- Using a compound pivot axis PIVOT
SELECT PVT.*
FROM (
SELECT
Country, sales_date, sales,
CONCAT(type_item, '_sales_', sales_code) AS Combined
FROM Data
) D
PIVOT (
SUM(sales)
FOR Combined IN (
hat_sales_ACTUAL, hat_sales_TARGET,
shirt_sales_ACTUAL, shirt_sales_TARGET,
pant_sales_ACTUAL, pant_sales_TARGET
)
) PVT
您还可以将
GROUP BY
与 条件聚合结合使用。
如果您事先不知道列,可以使用 动态 SQL 生成数据透视表
IN (...)
列表和/或最终选择列列表。
参见这个数据库<>小提琴。