Поверните одну колонку и сохраните столбцы SUM, AVG, COUNT - PullRequest
0 голосов
/ 15 марта 2020

Скажем, у меня есть таблица ПРОДУКТА, подобная этой.

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

Затем я получаю их сумму, среднее значение и счет по группам.

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

Я хочу повернуть столбец с именем продукта в нечто вроде этого.

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) )

1 Ответ

0 голосов
/ 15 марта 2020

Вы можете достичь этого, используя UNPIVOT и PIVOT.

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

Пожалуйста, ознакомьтесь с демонстрацией здесь .

...