#sql #aggregate-functions #where-clause
#sql #агрегатные функции #предложение where
Вопрос:
У меня есть таблица (упрощенный пример ниже), состоящая из ТЕСТОВ, тестовой ЦЕНЫ за тест и TESTSTATUS. Я хотел бы иметь возможность запускать запрос, результатом которого будут два агрегированных столбца, один для ожидаемого дохода и один для начального дохода для каждой тестовой группы.
Я могу легко сгенерировать две отдельные таблицы результатов, выполнив следующее:
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, действительно оценил