SQL запрос — Как применить различные условия (предложение Where?) к конкретным агрегированным столбцам

#sql #aggregate-functions #where-clause

#sql #агрегатные функции #предложение where

Вопрос:

У меня есть таблица (упрощенный пример ниже), состоящая из ТЕСТОВ, тестовой ЦЕНЫ за тест и TESTSTATUS. Я хотел бы иметь возможность запускать запрос, результатом которого будут два агрегированных столбца, один для ожидаемого дохода и один для начального дохода для каждой тестовой группы.

tblREQUEST

Я могу легко сгенерировать две отдельные таблицы результатов, выполнив следующее:

 SELECT
    Test
    ,SUM(TESTPRICE) AS 'PendingRev'
FROM
    REQUEST
WHERE
    TESTSTATUS = 'P'
GROUP BY
    TEST
ORDER BY
    TEST
SELECT
    Test
    ,SUM(TESTPRICE) AS 'StartedRev'
FROM
    REQUEST
WHERE
    TESTSTATUS = 'S'
GROUP BY
    TEST
ORDER BY
    TEST
  

Это приводит к двум выводимым результатам, подобным этому:

введите описание изображения здесь

введите описание изображения здесь

Однако я бы предпочел единую таблицу выходных результатов, подобную этой:

Желаемый результат

Может ли кто-нибудь указать мне правильное направление здесь, посоветовать метод, о котором я могу прочитать — я попробовал несколько разных подходов (подзапросы и т.д.), Но, похоже, самое близкое, что я получаю, — это общая сумма для данного TESTSTATUS во всех строках или ошибки

Любая помощь приветствуется

Комментарии:

1. Пометьте свой вопрос базой данных, которую вы используете.

Ответ №1:

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

 SELECT Test, 
       SUM(CASE WHEN TESTSTATUS = 'P' THEN TESTPRICE END) AS PendingRev,
       SUM(CASE WHEN TESTSTATUS = 'S' THEN TESTPRICE END) AS StartedRev
FROM REQUEST
GROUP BY TEST
ORDER BY TEST;
  

Ответ №2:

Вы можете использовать Pivot для достижения того же результата:

ДЕМОНСТРАЦИЯ

 SELECT * FROM TABLE1
PIVOT (SUM(TESTPRICE)
 FOR TESTSTATUS IN ('P' as PendingRev  , 'S' as StartedRev ));
  

Комментарии:

1. Спасибо Atif, действительно оценил