【问题标题】:Pivot One Column and Retain SUM,AVG,COUNT Columns旋转一列并保留 SUM、AVG、COUNT 列
【发布时间】:2023-04-04 08:31:01
【问题描述】:

假设我有一个这样的表 PRODUCT。

ProductName    Amount
---------------------
Soap           1.10
Toothbrush     2.00
Towel          3.00
Soap           3.00

然后我使用 group by 得到它们的总和、平均值和计数。

SELECT 
    [ProductName],
    SUM([Amount]) AS 'Sum', 
    COUNT(*) AS 'Count',
    AVG([Amount]) AS 'Avg'
FROM Product
GROUP BY [ProductIdName]

我有这个结果。

ProductName  Sum  Count  Avg
-----------------------------
Soap         4.10     2  2.05 
Toothbrush   2.00     1  2.00 
Towel        3.00     1  3.00

我想将 productname 列转换为类似的内容。

Type               Soap  Toothbrush  Towel
------------------------------------------
Products Sum       4.10        2.00   3.00 
Products Count        2           1      1
Products Average   2.05        2.00   3.00

我对每个聚合都使用了枢轴,然后全部联合,我认为这太冗长且效率不高?所以我在考虑是否有其他解决方案。

    SELECT 
        'Products Sum' AS [Type],
        *
    FROM Product t
    PIVOT(
        SUM(Amount)     
        FOR [ProductName] IN (
            [Soap], 
            [Toothbrush], 
            [Towel]
        )
    ) AS pivot_table
    UNION ALL
    SELECT 
        'Products Count' AS [Type],
        *
    FROM Product t
    PIVOT(
        COUNT(Amount)       
        FOR [ProductName] IN (
            [Soap], 
            [Toothbrush], 
            [Towel]
        )
    ) AS pivot_table
    ...etc ( pivot AVG(Amount) )

【问题讨论】:

    标签: sql sql-server tsql pivot


    【解决方案1】:

    您可以同时使用UNPIVOTPIVOT

    SELECT 
            'Products ' + col as [Type], [Soap], [Toothbrush], [Towel]
    from
    (SELECT 
        ProductName,
        CONVERT(sql_variant, SUM([Amount])) AS 'Sum', 
        CONVERT(sql_variant, COUNT(*)) AS 'Count',
        CONVERT(sql_variant, AVG([Amount])) AS 'Avg'
    FROM Product
    GROUP BY ProductName
    )t
    unpivot
    (
        val for col in ([sum], [count], [avg])
    )upvt
    pivot
    (
        max(val) for ProductName in ([Soap], [Toothbrush], [Towel])
    )pvt
    

    请看演示here

    【讨论】:

    • 哇。谢谢!这看起来真的很干净。在性能方面,这与枢轴联合之间是否存在显着差异,还是可以忽略不计?
    • @eyese7en 我检查了两种方法的统计数据(在 SQL Server 中),并没有看到一种方法相对于另一种方法有明确的性能提升。您可以接受答案(通过单击答案旁边的“右侧”图标),以便其他人可以轻松地看到问题已回答并且问题已解决。
    猜你喜欢
    • 1970-01-01
    • 2022-10-13
    • 2022-11-23
    • 1970-01-01
    • 2018-09-09
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    相关资源
    最近更新 更多