我可以毫无问题地在 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,但它太乏味了。
针对问题类型的良好查询是什么?
最佳答案
正如另一个答案中提到的,您不能在GROUP BY
中添加别名,但可以在ORDER BY
中添加别名。另外,DATE_FORMAT
是MySql函数。在 Oracle 中是 TO_CHAR
。
因此您的最终查询应如下所示:
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;
关于sql - 无法在 GROUP BY 中使用列别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60941634/