【问题标题】:SQL Pivot without Aggregation - duplicate entries没有聚合的 SQL Pivot - 重复条目
【发布时间】:2018-12-11 16:34:24
【问题描述】:

我有如下表结构

Create Table PivotTabSample (
    ID INT IDENTITY(100000001,1) NOT NULL,
    Product Nvarchar(30),
    StoreNumber INT,
    StoreSalesEstimate DECIMAL,
    StoreSalesActual DECIMAL
)

示例值使用以下插入填充 -

INSERT INTO [dbo].[PivotTabSample]
    ([Product],[StoreNumber],[StoreSalesEstimate],[StoreSalesActual])
 VALUES ('P0001','101',500,450)

INSERT INTO [dbo].[PivotTabSample]
    ([Product],[StoreNumber],[StoreSalesEstimate],[StoreSalesActual])
 VALUES ('P0002','101',300,350)

INSERT INTO [dbo].[PivotTabSample]
    ([Product],[StoreNumber],[StoreSalesEstimate],[StoreSalesActual])
 VALUES ('P0003','101',50,61)

INSERT INTO [dbo].[PivotTabSample]
    ([Product],[StoreNumber],[StoreSalesEstimate],[StoreSalesActual])
 VALUES ('P0004','101',100,900)

INSERT INTO [dbo].[PivotTabSample]
    ([Product],[StoreNumber],[StoreSalesEstimate],[StoreSalesActual])
 VALUES ('P0005','101',10,9)

INSERT INTO [dbo].[PivotTabSample]
    ([Product],[StoreNumber],[StoreSalesEstimate],[StoreSalesActual])
 VALUES ('P0001','102',1500,1450)

INSERT INTO [dbo].[PivotTabSample]
    ([Product],[StoreNumber],[StoreSalesEstimate],[StoreSalesActual])
 VALUES ('P0002','102',1400,3500)

INSERT INTO [dbo].[PivotTabSample]
    ([Product],[StoreNumber],[StoreSalesEstimate],[StoreSalesActual])
 VALUES ('P0003','102',150,610)

INSERT INTO [dbo].[PivotTabSample]
    ([Product],[StoreNumber],[StoreSalesEstimate],[StoreSalesActual])
 VALUES ('P0004','102',800,900)

我正在尝试对此数据集进行 PIVOT。我运行以下查询 -

SELECT Product, [101], [102]
FROM PivotTabSample 
PIVOT
(   min(StoreSalesActual) 
    FOR StoreNumber IN ([101],[102])
)AS p

得到的结果是不想要的方式 - 我没有得到产品和商店的详细信息。每个商店有两个产品行。 我不要那个。这里不需要聚合,但我不知道如何实现。

我想要这样的结果 -

Product   101ActualSales 101EstimatedSales 102ActualSales 102estimatedSales
P001      100              101                90            91
P002      
P003      
P001      

请指教。

【问题讨论】:

  • 是的。 PIVOT 令人困惑。表中的额外列会导致结果集中出现意外行。这就是为什么几乎所有示例在 FROM 子句中都有一个子查询,将列限制为查询中实际使用的列。
  • 您想要的结果与输入数据的格式/结构相同,只是列名不同...
  • 非常抱歉。这是对预期结果的错误表述。我已经更新了预期结果
  • 您使用的是哪个 dbms? (SQL Server?)
  • SQL 服务器 2014

标签: sql pivot


【解决方案1】:
WITH CTE
AS (SELECT Product,
           ISNULL([101], 0) AS '101ActualSales',
           ISNULL([102], 0) AS '102ActualSales',
           0 AS '101EstimatedSales',
           0 AS '102EstimatedSales'
    FROM PivotTabSample
        PIVOT
        (
            SUM(StoreSalesActual)
            FOR StoreNumber IN ([101], [102])
        ) AS p)
SELECT product,
       SUM([101ActualSales]) AS [101actualsales],
       SUM([101EstimatedSales]) AS [101EstimateSales],
       SUM([102ActualSales]) AS [102actualsales],
       SUM([102EstimatedSales]) AS [102EstimateSales]
FROM
(
    SELECT *
    FROM CTE
    UNION
    SELECT pt.Product,
           0 AS '101ActualSales',
           0 AS '102ActualSales',
           ISNULL([101], 0) AS '101EstimateSales',
           ISNULL([102], 0) AS '102EstimateSales'
    FROM PivotTabSample
        PIVOT
        (
            SUM(StoreSalesEstimate)
            FOR StoreNumber IN ([101], [102])
        ) AS pt
) AS x
GROUP BY product;

http://rextester.com/GFID38296

【讨论】:

  • @Sabyasachi Mukherjee 请查看我的编辑以了解您的更新格式
【解决方案2】:

刚刚在工作中遇到了类似的问题,我不得不修改与您的输出相同的枢轴,我发现包装到 CTE 中有所帮助。我只需要弄清楚原因,但我怀疑添加 StoreSalesActual 有帮助...

WITH cte AS
(
SELECT Product, 
StoreNumber,
StoreSalesActual
FROM #PivotTabSample
)
SELECT DISTINCT Product, [101], [102]
FROM cte
PIVOT
(   
MAX(StoreSalesActual) 
FOR StoreNumber IN ([101],[102])
)AS p
GROUP BY Product, [101], [102]

【讨论】:

  • 所需的输出数据有实际列和估计列。这个答案只给出实际列....
  • @MattBailie - 我知道,原来的问题在我发帖时被编辑了 - 我现在回来做我的“工作”了。
猜你喜欢
  • 2016-10-16
  • 2014-12-30
  • 1970-01-01
  • 2013-03-24
  • 2019-07-03
  • 2012-02-20
  • 1970-01-01
  • 2022-01-27
  • 2012-11-24
相关资源
最近更新 更多