sql - 像 Excel 数据透视表一样在 SQL Server 中创建数据透视查询

标签 sql sql-server pivot pivot-table

我正在尝试将 Excel 数据透视表转换为 SQL 查询,因此我不想先从 SQL Server 数据库中提取数据,然后在 Excel 中手动创建数据透视表,而是直接在 SQL 中创建数据透视表查询。

这是我的 data 的示例和 pivot table

我不知道如何完成我的 SQL 查询,我的开始是:

SELECT [Brand],[Location],[Qty],[Price] FROM ShipmentsTable 
PIVOT 
(
 SUM(Qty),SUM([Price])
 FOR [MFG Location] IN ... --not sure what to add here
)

有什么建议吗,我应该如何更新我的查询?

最佳答案

您可以尝试使用CASE WHENSUM函数来实现。

SELECT Brand,
       SUM(CASE WHEN Location = 'Austria' THEN qty END) 'Austria_qty',
       SUM(CASE WHEN Location = 'Austria' THEN Price  END) 'Austria_totle',
       SUM(CASE WHEN Location = 'France' THEN qty  END) 'France_qty',
       SUM(CASE WHEN Location = 'France' THEN Price END)'France_totle',
       SUM(CASE WHEN Location = 'Germany' THEN qty END) 'Germany_qty',
       SUM(CASE WHEN Location = 'Germany' THEN Price END)'Germany_totle',
       SUM(CASE WHEN Location = 'Italy' THEN qty END) 'Italy_qty',
       SUM(CASE WHEN Location = 'Italy' THEN Price END) 'Italy_totle'
FROM T
GROUP BY Brand

sqlfiddle:http://sqlfiddle.com/#!18/90e75/17

结果:

|   Brand | Austria_qty |      Austria_totle | France_qty | France_totle | Germany_qty | Germany_totle | Italy_qty | Italy_totle |
|---------|-------------|--------------------|------------|--------------|-------------|---------------|-----------|-------------|
|   Apple |           1 |            1351.16 |          1 |         9.96 |           2 |       1583.85 |         1 |     1053.83 |
|  Huawei |           1 |             744.67 |     (null) |       (null) |           2 |     207704.86 |    (null) |      (null) |
|  Lenovo |           2 |            1184.21 |          2 |      1420.43 |           2 |       3454.91 |    (null) |      (null) |
|   Nokia |      (null) |             (null) |          1 |       796.03 |      (null) |        (null) |         1 |      538.41 |
| Samsung |      (null) |             (null) |          1 |      3327.14 |      (null) |        (null) |         1 |        9.09 |

编辑

我看到了你的提交,如果你想获得Total,你可以尝试使用与ROLLUP

SELECT COALESCE(Brand, 'Total') Brand,
         SUM(CASE WHEN Location = 'Austria' THEN qty END) 'Austria_qty',
         SUM(CASE WHEN Location = 'Austria' THEN Price  END) 'Austria_totle',
         SUM(CASE WHEN Location = 'France' THEN qty  END) 'France_qty',
         SUM(CASE WHEN Location = 'France' THEN Price END)'France_totle',
         SUM(CASE WHEN Location = 'Germany' THEN qty END) 'Germany_qty',
         SUM(CASE WHEN Location = 'Germany' THEN Price END)'Germany_totle',
         SUM(CASE WHEN Location = 'Italy' THEN qty END) 'Italy_qty',
         SUM(CASE WHEN Location = 'Italy' THEN Price END) 'Italy_totle'
  FROM T
  GROUP BY Brand with ROLLUP

sqlfiddle

结果

|   Brand | Austria_qty |      Austria_totle | France_qty |       France_totle | Germany_qty | Germany_totle | Italy_qty |        Italy_totle |
|---------|-------------|--------------------|------------|--------------------|-------------|---------------|-----------|--------------------|
|   Apple |           1 |            1351.16 |          1 |               9.96 |           2 |       1583.85 |         1 |            1053.83 |
|  Huawei |           1 |             744.67 |     (null) |             (null) |           2 |     207704.86 |    (null) |             (null) |
|  Lenovo |           2 | 1184.2099999999998 |          2 |            1420.43 |           2 |       3454.91 |    (null) |             (null) |
|   Nokia |      (null) |             (null) |          1 |             796.03 |      (null) |        (null) |         1 |             538.41 |
| Samsung |      (null) |             (null) |          1 |            3327.14 |      (null) |        (null) |         1 |               9.09 |
|   Totle |           4 |            3280.04 |          5 | 5553.5599999999995 |           6 |     212743.62 |         3 | 1601.3299999999997 |

关于sql - 像 Excel 数据透视表一样在 SQL Server 中创建数据透视查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51089770/

相关文章:

sql - 消息 102,级别 15,状态 1,第 3 行 ',' 附近的语法不正确

java - 在 SQL 查询中使用 %

python - 使用pivot_table后对pandas数据框进行子集化

mysql - 如何将列结果转换为 SQL 中的列标题?

mysql - SQL - 列出与其他属性一起出现的属性

sql - 如何与其他过程的调用进行外部连接

sql-server - varbinary(max) 数据类型无效

sql - 多表递归查询

sql - 如何使用复合键在 SQL Server 中实现参照完整性?

python - 在没有数据透视表的情况下展平 pandas DataFrame