【问题标题】:How to write a SQL query for the following result?如何为以下结果编写 SQL 查询?
【发布时间】:2021-07-01 02:14:35
【问题描述】:

这是我当前的表格数据:

Godown_Column Product_Column Quantity
Godown 1 Product 1 10
Godown 1 Product 2 20
Godown 2 Product 3 30
Godown 3 Product 3 40

这里,Godowns_Columns 的行数不受限制,具有不同的货仓。

如何编写 SQL 查询来获得此结果:

Product_Col Godown 1 Godown 2 Godown 3
Product 1 10
Product 2 20
Product 3 30 40

【问题讨论】:

标签: sql sql-server tsql sql-server-2012 dynamic-pivot


【解决方案1】:

您可以使用动态枢轴,因为仓库数量未知。

架构:

 create table mytable(Godown_Column varchar(50),    Product_Column  varchar(50), Quantity int)
 insert into mytable values('Godown 1', 'Product 1' ,10);
 insert into mytable values('Godown 1', 'Product 2' ,20);
 insert into mytable values('Godown 2', 'Product 3' ,30);
 insert into mytable values('Godown 3', 'Product 3' ,40);

查询:

 DECLARE @cols  AS NVARCHAR(MAX)='';
 DECLARE @query AS NVARCHAR(MAX)='';
 
 
 SET @cols = STUFF((SELECT distinct ',' + quotename(Godown_Column)
             FROM mytable
             FOR XML PATH(''), TYPE
             ).value('.', 'NVARCHAR(MAX)') 
         ,1,1,'')
         
 
 set @query = 'SELECT Product_Column,' + @cols  + '
              from 
              (
 select * from mytable
              ) x
             pivot 
             (
                 sum(quantity)
                 for Godown_Column in (' + @cols + ')
             ) p'
 
 execute(@query)

输出:

Product_Column Godown 1 Godown 2 Godown 3
Product 1 10 null null
Product 2 20 null null
Product 3 null 30 40

dbhere

【讨论】:

    【解决方案2】:
    WITH GODOWNS(Godown_Column,     Product_Column,     Quantity) AS
    (
        SELECT 'Godown 1',  'Product 1',    10 UNION ALL
        SELECT 'Godown 1',  'Product 2',    20 UNION ALL
        SELECT 'Godown 2',  'Product 3',    30 UNION ALL
        SELECT 'Godown 3',  'Product 3',    40
    )
    SELECT D.Product_Column,
      MAX(CASE WHEN Godown_Column='Godown 1' THEN QUANTITY ELSE 0 END)AS GODOWN_1,
      MAX(CASE WHEN Godown_Column='Godown 2' THEN QUANTITY ELSE 0 END)AS GODOWN_2,
      MAX(CASE WHEN Godown_Column='Godown 3' THEN QUANTITY ELSE 0 END)AS GODOWN_3
    FROM GODOWNS AS D
    GROUP BY D.Product_Column
    

    GODOWNS 是您的数据示例。请将对它的引用替换为对实际表的引用

    【讨论】:

    • 货仓不是固定的,它们是无限的,甚至不知道名字,我只是提到了那里的例子,货仓1,....?
    • 所以你可以拥有 Godown1....Gowndown100 吗?如果是,那么我想你可以尝试谷歌“动态枢轴”。据我记得,ItzikBen-Gan 有一篇文章介绍了它的实现
    • 但是谷歌搜索中的动态数据透视示例也需要传递列的名称,我没有找到确切的解决方案,我已经按照这个链接sqlshack.com/dynamic-pivot-tables-in-sql-server
    猜你喜欢
    • 2018-08-12
    • 2017-03-04
    • 2021-05-01
    • 2014-03-18
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多