Сумма SQL по разделу BY Рассчитать% от группы

Может кто-нибудь сказать мне, почему ниже не скомпилировать?

Я пытаюсь подсчитать, какой% транзакции с отметкой "M3" приходится на всю партию.

Я думаю, что было бы достаточно легко, если бы была только одна партия, но иногда их будет несколько.

Весь код ниже:

SELECT 
    [Batch],
    [DocNum],
    [Date],
    [Time],
    [Location],
    [ItemCode],
    [Brand],
    [Quantity],
    CASE
        WHEN [Variance] IS NULL
            THEN ''
        ELSE [Variance]
    END AS [Variance],
    CASE
        WHEN [Comments] IS NULL
            THEN ''
        ELSE [Comments]
    END AS [Comments],
    CASE
        WHEN [Variance] = 'M3'
            THEN(
                (
                (SELECT
                    ABS([Quantity])
                  FROM #BatchReport
                  WHERE [Variance] = 'M3')
                 / 
                 (SELECT
                     SUM([Quantity])
                     FROM #BatchReport
                     WHERE [Quantity] > 0)
                ) * 100) OVER (PARTITION BY [Batch])
        ELSE '0'
    END AS [Pct Loss],                          
    SUM([Quantity]) OVER (PARTITION BY [Batch]) AS [Difference],
    ((SUM([Quantity]) - MAX([Quantity])) * 100) / MAX([Quantity]) OVER (PARTITION BY [Batch]) AS [Pct Difference]


FROM #BatchReport
WHERE [DocNum] IS NOT NULL
GROUP BY [Batch], [DocNum], [Date], [Time], [Variance], [Brand], [Comments], [Quantity], [Location], [ItemCode]
ORDER BY [Batch], [Date], [Time]

Текст ошибки: Incorrect syntax near the keyword 'OVER'.

Ошибка исчезает, если я удаляю эту часть:

CASE
        WHEN [Variance] = 'M3'
            THEN(
                (
                (SELECT
                    ABS([Quantity])
                  FROM #BatchReport
                  WHERE [Variance] = 'M3')
                 / 
                 (SELECT
                     SUM([Quantity])
                     FROM #BatchReport
                     WHERE [Quantity] > 0)
                ) * 100) OVER (PARTITION BY [Batch])
        ELSE '0'
    END AS [Pct Loss]

Пример чего-то вроде того, что я пытаюсь получить: введите описание изображения здесь

Спасибо!

1 ответ

Решение

Ваша логика выражения в основном непостижима. Я предполагаю, что вы хотите какое-то соотношение между значениями "M3" и общими значениями. Моя лучшая догадка:

(100.0 * SUM(CASE WHEN [Variance] = 'M3' THEN ABS([Quantity]) END) /
 SUM(CASE WHEN Quantity > 0 THEN Quantity END ) OVER (PARTITION BY Batch)
) as [Pct Loss]

Тем не менее, ваш GROUP BY это настолько сложно, что я был бы удивлен, если бы ваш запрос сделал то, что вы хотите. Я думаю, что вы должны опубликовать еще один вопрос с образцами данных и желаемых результатов.

Другие вопросы по тегам