ROLLUP не влияет на мой агрегат - PullRequest
0 голосов
/ 23 мая 2011

У меня есть запрос, подобный следующему:

SELECT  CASE WHEN (GROUPING(Name) = 1) THEN 'All' ELSE Name END AS Name, 
        CASE WHEN (GROUPING(Type) = 1) THEN 'All' ELSE Type END AS Type,
        sum(quantity) AS [Quantity],
        CAST(sum(quantity) * (SELECT QuantityMultiplier FROM QuantityMultipliers WHERE a = t.b) AS DECIMAL(18,2)) AS Multiplied Quantity
FROM @Table t
GROUP BY Name, Type WITH ROLLUP

Я пытаюсь вернуть список Имен, Типов, суммированного количества и суммированного количества, умноженного на произвольное число. Пока все хорошо. Мне также нужно вернуть итоговую строку для каждого имени и типа, например, следующее

Name        Type        Quantity        Multiplied Quantity
-------     ---------   -----------     -------------------
a           1           2               4
a           2           3               3
a           ALL         5               7
b           1           6               12
b           2           1               1
b           ALL         7               13
ALL         ALL         24              40

Первые 3 столбца в порядке. Я получаю нулевые значения в строках сворачивания для умноженного количества все же. Единственная причина, по которой я могу думать, что это происходит, заключается в том, что SQL не распознает последний столбец как агрегат, поскольку я умножил его на что-то.

Можно ли как-то обойти это без запутанных вещей?

Я вернусь к временным таблицам, если это невозможно.

1 Ответ

1 голос
/ 23 мая 2011

В вашем подзапросе для получения множителя у вас есть WHERE a=b.Являются ли a или b из таблиц в вашем основном запросе?

Если эти значения являются статическими (ничего общего с основным запросом), похоже, что все должно быть в порядке ...

Если значения a или b являются полями name или type, они могут быть NULL для сводных записей.Если это так, вы можете изменить на что-то похожее на ...

CAST(sum(quantity * (<multiplie_query>)) AS DECIMAL(18,2)).


Если a или b - это другое поле изВаш основной запрос, вы получите обратно несколько записей, а не один множитель.Вы можете изменить что-то вроде ...

CAST(sum(quantity) * (SELECT MAX(multiplier) FROM ...)) AS DECIMAL(18,2))

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...