Как объединить два подзапроса с помощью CASE на SQL сервере - PullRequest
0 голосов
/ 21 июня 2020

У меня есть 2 подзапроса

SELECT 
    SUM(QTY_BOUGHT * PRICE), 
    SUM(QTY_BOUGHT), 
    SUM(QTY_BOUGHT * PRICE) / SUM(QTY_BOUGHT)
FROM 
    TABLE_A
WHERE 
    DAYS_AGED >= 792

и

SELECT 
    SUM(QTY_BOUGHT * PRICE), 
    SUM(QTY_BOUGHT), 
    SUM(QTY_BOUGHT * PRICE) / SUM(QTY_BOUGHT)
FROM 
    TABLE_A
WHERE 
    DAYS_AGED < 792

Проблема в том, что я хочу объединить их, используя простой оператор case как:

SELECT
    CASE 
       WHEN DAYS_AGED >= 792 
          THEN SUM(QTY_BOUGHT * PRICE) / SUM(QTY_BOUGHT)
       WHEN DAYS_AGED < 792 
          THEN SUM(QTY_BOUGHT * PRICE) / SUM(QTY_BOUGHT)
    END
FROM 
    TABLE_A

Я получаю эту ошибку:

Msg 8120, уровень 16, состояние 1, строка 127 Столбец 'TABLE_A.DAYS_AGED' недопустим в списке выбора, потому что он не содержится ни в агрегатной функции, ни в предложении GROUP BY.

Я могу добавить, я могу объединить их, используя UNION или CTE , это работает

SELECT 
    SUM(QTY_BOUGHT * PRICE), 
    SUM(QTY_BOUGHT), 
    SUM(QTY_BOUGHT * PRICE) / SUM(QTY_BOUGHT)
FROM 
    TABLE_A
WHERE 
    DAYS_AGED >= 792
UNION
SELECT 
    SUM(QTY_BOUGHT * PRICE), 
    SUM(QTY_BOUGHT), 
    SUM(QTY_BOUGHT * PRICE) / SUM(QTY_BOUGHT)
FROM 
    TABLE_A
WHERE 
    DAYS_AGED < 792

Есть ли способ сопоставить эти 2 подзапроса с помощью оператора CASE, есть ли возможность сделать это

Ответы [ 2 ]

2 голосов
/ 21 июня 2020

Вам нужно поместить CASE выражение в агрегатные функции:

SELECT 
    SUM(CASE WHEN DAYS_AGED >= 792 THEN QTY_BOUGHT*PRICE END) amount1, 
    SUM(CASE WHEN DAYS_AGED >= 792 THEN QTY_BOUGHT END) qty_bought1, 
    SUM(CASE WHEN DAYS_AGED >= 792 THEN QTY_BOUGHT * PRICE END) 
        / SUM(CASE WHEN DAYS_AGED >= 792 THEN QTY_BOUGHT END) avg1,
    SUM(CASE WHEN DAYS_AGED <  792 THEN QTY_BOUGHT*PRICE END) amount2, 
    SUM(CASE WHEN DAYS_AGED <  792 THEN QTY_BOUGHT END) qty_bought2, 
    SUM(CASE WHEN DAYS_AGED <  792 THEN QTY_BOUGHT * PRICE END) 
        / SUM(CASE WHEN DAYS_AGED <  792 THEN QTY_BOUGHT END) avg2
FROM TABLE_A
0 голосов
/ 21 июня 2020

Вы можете использовать свое условие в операторе CASE в CTE, а затем использовать его в GROUP BY следующим образом:

WITH CTE AS
(
    SELECT CASE WHEN DAYS_AGED >= 792 THEN 1 ELSE 0 END AS DAYS_AGED_GREATER_OR_EQUAL_792,
            QTY_BOUGHT, PRICE
        FROM TABLE_A
)
SELECT DAYS_AGED_GREATER_OR_EQUAL_792, SUM(QTY_BOUGHT * PRICE), SUM(QTY_BOUGHT),
        SUM(QTY_BOUGHT * PRICE) / SUM(QTY_BOUGHT)
    FROM CTE
    GROUP BY DAYS_AGED_GREATER_OR_EQUAL_792;
...