Процент возвращаемого значения подкатегории в SQL - PullRequest
2 голосов
/ 04 февраля 2012

У меня есть запрос: (используя очень простой пример)

SELECT
    ItemCategory,
    ItemID,
    Sales
FROM
    MyTable
WHERE
    CustomerID = 1

, который возвращает

ItemCategory | ItemID | Sales
A              0        75.00    
A              1        50.00
A              2         0.00
B              3        25.00
B              4        25.00
C              5        20.00 
C              6        30.00
C              7        10.00
C              8         0.00
C              9        50.00

Как я могу изменить этот запрос, чтобы получить процент от продаж длякаждый элемент, сгруппированный по ItemCategory?

То есть я бы хотел, чтобы это возвращалось:

ItemCategory | ItemID | Sales  | PercentageOfCategory
A              0        75.00    60%
A              1        50.00    40%
A              2         0.00     0%
B              3        25.00    50%
B              4        25.00    50%
C              5        20.00    20%
C              6        30.00    30%
C              7        10.00    10%
C              8         0.00     0%
C              9        50.00    50%

Я пытался сделать пример как можно более простым, реальный запрос довольно сложный, но я представляюта же логика все еще применяется.

РЕДАКТИРОВАТЬ: Я считаю, что сервер SQL Server 2008

Ответы [ 3 ]

2 голосов
/ 04 февраля 2012

Вы не упомянули, какая версия SQL-сервера, но если у вас 2005+, вы можете использовать Common Table Expressions (CTE)

;WITH RawData As
(
    SELECT
        ItemCategory,
        ItemID,
        Sales
    FROM
        MyTable
    WHERE
        CustomerID = 1
),
GroupedData As
(
    SELECT
        ItemCategory,
        Sum(Sales) As TotalSales
    FROM
        RawData
    GROUP BY
        ItemCategory
)
SELECT
    R.ItemCategory,
    R.ItemID,
    R.Sales,
    R.Sales / G.TotalSales * 100.0 As PercentageSales
FROM
    RawData R
INNER JOIN
    GroupedData G
ON
    R.ItemCategory = G.ItemCategory
1 голос
/ 04 февраля 2012

Предполагается, что SQL Server 2005+ для CTE :

WITH cteCategoryTotals AS (
    SELECT ItemCategory, SUM(Sales) AS TotalSales
        FROM MyTable
        WHERE CustomerID = 1
        GROUP BY ItemCategory)
SELECT m.ItemCategory, m.ItemId, m.Sales, (m.Sales/c.TotalSales)*100.0 AS PercentageOfCategory
    FROM MyTable m
        INNER JOIN cteCategoryTotals
            ON m.ItemCategory= c.ItemCategory
    WHERE m.CustomerID = 1
0 голосов
/ 04 февраля 2012

Вы можете использовать SUM ... OVER

SELECT
    ItemCategory,
    ItemID,
    Sales,
    100.0 * Sales / 
    NULLIF(SUM(Sales) OVER (PARTITION BY ItemCategory),0) AS PercentageOfCategory
FROM
    MyTable
WHERE
    CustomerID = 1
...