变换视图表

问题描述 投票:0回答:1

我想根据 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

我确实尝试过使用连接,但似乎很难做到正确。

sql sql-server join data-modeling
1个回答
0
投票

是的,有很多使用 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 (...)
列表和/或最终选择列列表。

参见这个数据库<>小提琴

© www.soinside.com 2019 - 2024. All rights reserved.