不能在 GROUP BY 中使用列别名

Can't use column alias in GROUP BY

我可以 运行 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,但这太乏味了。

对于问题类型,什么是好的查询?

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;

如另一个答案所述,您不能在 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;