如何在SSMS(SQL Server)中创建指定格式的视图表?
解决方案:行转列实现目标视图
源表结构与数据
| 国家 | 销售日期 | 销售编码 | 商品类型 | 销售额 |
|---|---|---|---|---|
| 阿尔及利亚 | 06/01/2024 | ACTUAL | Hat | 200 |
| 阿尔及利亚 | 06/01/2024 | ACTUAL | Shirt | 145 |
| 阿尔及利亚 | 06/01/2024 | ACTUAL | Pant | 150 |
| 阿尔及利亚 | 06/01/2024 | TARGET | Hat | 90 |
| 阿尔及利亚 | 06/01/2024 | TARGET | Shirt | 500 |
| 阿尔及利亚 | 06/01/2024 | TARGET | Pant | 100 |
期望视图格式
| 国家 | 销售日期 | 帽子实际销售额 | 帽子目标销售额 | 衬衫实际销售额 | 衬衫目标销售额 | 裤子实际销售额 | 裤子目标销售额 |
|---|---|---|---|---|---|---|---|
| 阿尔及利亚 | 06/01/2024 | 200 | 90 | 145 | 500 | 150 | 100 |
实现SQL(创建视图)
假设源表名为SalesData,用条件聚合实现行转列,比JOIN更简洁高效:
CREATE VIEW vw_SummarySales AS SELECT 国家, 销售日期, MAX(CASE WHEN 商品类型 = 'Hat' AND 销售编码 = 'ACTUAL' THEN 销售额 END) AS 帽子实际销售额, MAX(CASE WHEN 商品类型 = 'Hat' AND 销售编码 = 'TARGET' THEN 销售额 END) AS 帽子目标销售额, MAX(CASE WHEN 商品类型 = 'Shirt' AND 销售编码 = 'ACTUAL' THEN 销售额 END) AS 衬衫实际销售额, MAX(CASE WHEN 商品类型 = 'Shirt' AND 销售编码 = 'TARGET' THEN 销售额 END) AS 衬衫目标销售额, MAX(CASE WHEN 商品类型 = 'Pant' AND 销售编码 = 'ACTUAL' THEN 销售额 END) AS 裤子实际销售额, MAX(CASE WHEN 商品类型 = 'Pant' AND 销售编码 = 'TARGET' THEN 销售额 END) AS 裤子目标销售额 FROM SalesData GROUP BY 国家, 销售日期;
逻辑说明
- 分组:按
国家和销售日期分组,确保每一行对应一个国家+日期的汇总数据。 - 条件聚合:用
CASE WHEN筛选出每个商品类型+销售编码组合的销售额,再用MAX(或SUM,因每个分组下该组合唯一)提取对应数值,无数据时自动返回NULL。
若商品类型或销售编码需动态扩展,可改用动态SQL生成视图,固定类型下上述静态SQL足够稳定。
内容的提问来源于stack exchange,提问作者Arc Angel
相关产品推荐
相关产品推荐

