Не может использовать псевдоним столбца в GROUP BY - PullRequest
0 голосов
/ 31 марта 2020

Я могу запустить это в mysql без проблем

SELECT 
    DATE_FORMAT(trans_date, '%Y-%m') month, 
    COUNTRY, COALESCE(COUNT(*), 0) trans_count,
    COALESCE(SUM(CASE WHEN state ='approved' THEN 1 END), 0) approved_count,
    COALESCE(SUM(amount), 0) trans_total_amount,
   COALESCE(SUM(CASE WHEN state ='approved' THEN amount END), 0) approved_total_amount
FROM 
    Transactions
GROUP BY 
    month, COUNTRY
ORDER BY 
    month;

, но тот же запрос не выполняется в Orcale, я не могу использовать GROUP BY с использованием псевдонима агрегации, и я могу ' Агрегирование без использования GROUP BY.

Я могу вызвать подзапрос над подзапросом или использовать CTE, но это так утомительно.

Что такое хороший запрос для типа проблемы?

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Как уже упоминалось в другом ответе, вы не можете добавлять псевдонимы в GROUP BY, но вы можете добавлять псевдонимы в ORDER BY. Кроме того, DATE_FORMAT является функцией MySql. Это TO_CHAR в Oracle.

Таким образом, ваш окончательный запрос должен быть следующим:

SELECT
    TO_CHAR(TRANS_DATE, 'YYYY-MM') AS MONTH,
    COUNTRY,
    COUNT(*) AS TRANS_COUNT,
    SUM(CASE WHEN STATE = 'approved'  THEN 1 ELSE 0 END) AS APPROVED_COUNT,
    SUM(AMOUNT) AS TRANS_TOTAL_AMOUNT,
    SUM(CASE WHEN STATE = 'approved' THEN AMOUNT ELSE 0 END) AS APPROVED_TOTAL_AMOUNT
FROM TRANSACTIONS
GROUP BY TO_CHAR(TRANS_DATE, 'YYYY-MM'), COUNTRY
ORDER BY MONTH;
0 голосов
/ 31 марта 2020

Oracle не поддерживает псевдонимы для GROUP BY. Кроме того, COALESCE() не требуется в этом случае:

SELECT DATE_FORMAT(trans_date, '%Y-%m') as month, COUNTRY,
       COUNT(*) as trans_count,
       SUM(CASE WHEN state ='approved' THEN 1 ELSE 0 END) as approved_count,
       SUM(amount) as trans_total_amount,
       SUM(CASE WHEN state = 'approved' THEN amount ELSE 0 END) as  approved_total_amount
FROM Transactions
GROUP BY DATE_FORMAT(trans_date, '%Y-%m'), COUNTRY
ORDER BY month;
...