Использование массива в условном суммировании с группировкой - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть SQL-запрос, который отлично работает

SELECT
    CAST(L.CreationUtcDateTime AS DATE),
    SUM(L.Profit),
    SUM(CASE WHEN (L.Network = 0 OR L.Network = 1) THEN L.Profit ELSE 0 END),
    SUM(CASE WHEN (L.Network != 0 AND L.Network != 1) THEN L.Profit ELSE 0 END)

FROM
    [dbo].[Leads] L WITH (NOLOCK)
    LEFT JOIN [dbo].[Transactions] S WITH (NOLOCK) ON L.TransactionId = S.Id

GROUP BY    
    CAST(L.CreationUtcDateTime AS DATE);

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

DECLARE @matchNetworks TABLE (id int)
INSERT @matchNetworks(id) VALUES (0),(1)


SELECT
    CAST(L.CreationUtcDateTime AS DATE),
    SUM(L.Profit),
    SUM(CASE WHEN (L.Network in (SELECT ID from @matchNetworks)) THEN L.Profit ELSE 0 END),
    SUM(CASE WHEN (L.Network not in (SELECT ID from @matchNetworks)) THEN L.Profit ELSE 0 END)

FROM
    [dbo].[Leads] L WITH (NOLOCK)
    LEFT JOIN [dbo].[Transactions] S WITH (NOLOCK) ON L.TransactionId = S.Id

GROUP BY    
    CAST(L.CreationUtcDateTime AS DATE);

И теперь у меня есть ошибка: Невозможно выполнить агрегатную функцию для выражения, содержащего агрегат или подзапрос.

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

1 Ответ

0 голосов
/ 19 апреля 2019

Переместите сравнение в предложение FROM, используя LEFT JOIN:

SELECT CAST(L.CreationUtcDateTime AS DATE),
       SUM(L.Profit),
       SUM(CASE WHEN mn.ID IS NOT NULL THEN L.Profit ELSE 0 END),
       SUM(CASE WHEN mn.ID IS NULL THEN L.Profit ELSE 0 END)    
FROM [dbo].[Leads] L LEFT JOIN
     [dbo].[Transactions] S 
     ON L.TransactionId = S.Id LEFT JOIN
     @matchNetworks mn
     ON mn.ID = l.Network
GROUP BY CAST(L.CreationUtcDateTime AS DATE);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...