Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中创建类似Excel Pivot表的Pivot查询_Sql_Sql Server_Pivot_Pivot Table - Fatal编程技术网

在SQL Server中创建类似Excel Pivot表的Pivot查询

在SQL Server中创建类似Excel Pivot表的Pivot查询,sql,sql-server,pivot,pivot-table,Sql,Sql Server,Pivot,Pivot Table,我正在尝试将Excel数据透视转换为SQL查询,因此我希望直接在SQL中创建数据透视查询,而不是先从SQL Server数据库提取数据,然后在Excel中手动创建数据透视表 这是我的和的一个例子 我被困在如何完成SQL查询中,我的起点是: SELECT [Brand],[Location],[Qty],[Price] FROM ShipmentsTable PIVOT ( SUM(Qty),SUM([Price]) FOR [MFG Location] IN ... --not sure

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

这是我的和的一个例子

我被困在如何完成SQL查询中,我的起点是:

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

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

您可以尝试使用
CASE WHEN
SUM
函数来实现

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:

结果

|   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 |
编辑

|   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 |
我看到了你的承诺

您可以尝试使用
UNION ALL
组合
totle
查询和
Sum
查询

;WITH CTE(Brand,Austria_qty,Austria_totle,France_qty,France_totle,Germany_qty,Germany_totle,Italy_qty,Italy_totle) 
AS (
  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
)

SELECT Brand,
    Austria_qty,
    Austria_totle,
    France_qty,
    France_totle,
    Germany_qty,
    Germany_totle,
    Italy_qty,
    Italy_totle 
FROM CTE
UNION ALL 
SELECT 'Totle',
    SUM(Austria_qty),
    SUM(Austria_totle),
    SUM(France_qty),
    SUM(France_totle),
    SUM(Germany_qty),
    SUM(Germany_totle),
    SUM(Italy_qty),
    SUM(Italy_totle) 
FROM CTE
sqlfiddle:


如果不想使用
UNION ALL
组合两个查询。还有另一种方法可以做到

使用
交叉应用

SELECT tt.brand,
       SUM(tt.austria_qty) 'austria_qty',
       SUM(tt.austria_totle) 'austria_totle',
       SUM(tt.france_qty) 'austria_qty',
       SUM(tt.france_totle) 'austria_totle',
       SUM(tt.germany_qty) 'austria_qty',
       SUM(tt.germany_totle) 'austria_totle',
       SUM(tt.italy_qty) 'austria_qty',
       SUM(tt.italy_totle) 'austria_totle'
FROM T CROSS APPLY (
  VALUES (Brand
          ,(CASE WHEN [Location] = 'Austria' THEN [qty] END) 
          ,(CASE WHEN [Location] = 'Austria' THEN [Price] END) 
          ,(CASE WHEN [Location] = 'France' THEN [qty] END) 
          ,(CASE WHEN [Location] = 'France' THEN [Price] END) 
          ,(CASE WHEN [Location] = 'Germany' THEN [qty] END) 
          ,(CASE WHEN [Location] = 'Germany' THEN [Price] END) 
          ,(CASE WHEN [Location] = 'Italy' THEN [qty] END)
          ,(CASE WHEN [Location] = 'Italy' THEN [Price] END) 
         ),
         (
         'Totle'
          ,(CASE WHEN [Location] = 'Austria' THEN [qty] END) 
          ,(CASE WHEN [Location] = 'Austria' THEN [Price] END) 
          ,(CASE WHEN [Location] = 'France' THEN [qty] END) 
          ,(CASE WHEN [Location] = 'France' THEN [Price] END) 
          ,(CASE WHEN [Location] = 'Germany' THEN [qty] END) 
          ,(CASE WHEN [Location] = 'Germany' THEN [Price] END) 
          ,(CASE WHEN [Location] = 'Italy' THEN [qty] END)
          ,(CASE WHEN [Location] = 'Italy' THEN [Price] END) 
         )
) tt(brand, 
     austria_qty, 
     austria_totle, 
     france_qty,  
     france_totle, 
     germany_qty, 
     germany_totle, 
     italy_qty, 
     italy_totle)
GROUP BY tt.brand
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 |

在([奥地利]、[法国]、[意大利]…)作为pvt
如果有很多这样的解决方案,你可以使用感谢,但它不是动态的。我需要手动调整位置,每次我都试图避免什么是你的意思?您能给我看一下您的预期结果吗?我添加了两个选择查询,一个用于计算每个品牌的总数量和价格,应作为最后一列添加到exampe的输出中,另一个用于计算每个位置的总数量和价格,应添加到最后一行。请在这里检查我添加的内容