當我嘗試group by使用名為 的 CASE 運算式的結果執行 a 時as Ticket,TOAD 未能說明Ticket它不是有效專案
SELECT
CASE WHEN ( amt_1 >= 10000000 ) THEN 'R100000'
WHEN ( amt_1 < 9000000 and amt_1 >= 8000000 ) THEN 'R090000'
WHEN ( amt_1 < 8000000 and amt_1 >= 7000000 ) THEN 'R080000'
WHEN ( amt_1 < 7000000 and amt_1 >= 6000000 ) THEN 'R070000'
WHEN ( amt_1 < 6000000 and amt_1 >= 5000000 ) THEN 'R060000'
WHEN ( amt_1 < 5000000 and amt_1 >= 4000000 ) THEN 'R050000'
WHEN ( amt_1 < 4000000 and amt_1 >= 3000000 ) THEN 'R040000'
WHEN ( amt_1 < 3000000 and amt_1 >= 2000000 ) THEN 'R030000'
WHEN ( amt_1 < 2000000 and amt_1 >= 1000000 ) THEN 'R020000'
WHEN ( amt_1 < 1000000 and amt_1 >= 500000 ) THEN 'R010000'
WHEN ( amt_1 < 500000 and amt_1 >= 100000 ) THEN 'R005000'
WHEN ( amt_1 < 100000 ) THEN 'R001000'
END as Ticket,
CAST ( SUM(AMT_1/100) AS DECIMAL(10,2) )
Count(*)
FROM BASE24.PTLF
GROUP BY Ticket
uj5u.com熱心網友回復:
在 Oracle SQL(以及 SQL 標準中 - 盡管顯然不是在所有 SQL 方言中)中,您不能按僅在 SELECT 子句中定義的列名(別名)進行分組。該名稱Ticket僅在執行 SELECT 子句時分配給您的運算式,即在處理 GROUP BY 之后 - 盡管語法中子句的順序可能暗示了什么。
最簡單的解決方案是撰寫一個子查詢,在其中定義Ticket為該case運算式,然后從子查詢中進行選擇并根據需要使用 GROUP BY 子句。
更丑:您可以case從 SELECT 子句中復制整個運算式并將其粘貼到 GROUP BY 子句中(用整個運算式替換列名)。您可能認為這個更丑陋的查詢會更有效,因為它不需要子查詢和外部查詢;但事實并非如此。優化器將從“好看”的查詢(帶有子查詢)中洗掉子查詢,并且它會自行將查詢重寫為“丑陋”的查詢,而無需您的幫助。
最佳:標準應該(但不允許)允許您/我們case在 GROUP BY 子句中撰寫運算式并在那里給它一個別名,然后讓我們在 SELECT 子句中使用別名。唉,這不在標準中,也沒有在我所知道的任何方言中實作,盡管從邏輯上講它應該沒有問題:我們被允許在很多其他地方“創建列名”,比如在pivot操作中,在match_recognize,在該model條款等,為什么不能在group by-只有標準的作家知道。
uj5u.com熱心網友回復:
使用公用表運算式:
WITH cteTicket_data
AS (SELECT CASE
WHEN ( amt_1 >= 10000000 ) THEN 'R100000'
WHEN ( amt_1 < 9000000 and amt_1 >= 8000000) THEN 'R090000'
WHEN ( amt_1 < 8000000 and amt_1 >= 7000000) THEN 'R080000'
WHEN ( amt_1 < 7000000 and amt_1 >= 6000000) THEN 'R070000'
WHEN ( amt_1 < 6000000 and amt_1 >= 5000000) THEN 'R060000'
WHEN ( amt_1 < 5000000 and amt_1 >= 4000000) THEN 'R050000'
WHEN ( amt_1 < 4000000 and amt_1 >= 3000000) THEN 'R040000'
WHEN ( amt_1 < 3000000 and amt_1 >= 2000000) THEN 'R030000'
WHEN ( amt_1 < 2000000 and amt_1 >= 1000000) THEN 'R020000'
WHEN ( amt_1 < 1000000 and amt_1 >= 500000) THEN 'R010000'
WHEN ( amt_1 < 500000 and amt_1 >= 100000) THEN 'R005000'
WHEN ( amt_1 < 100000 ) THEN 'R001000'
END as Ticket,
CAST(AMT_1/100 AS DECIMAL(10,2) AS AMT
FROM BASE24.PTLF)
SELECT TICKET,
SUM(AMT),
Count(*) AS TICKET_AMT_COUNT
FROM cteTicket_data
GROUP BY Ticket
uj5u.com熱心網友回復:
您不能SELECT在WHERE,GROUP BY或子句中的查詢子句中使用定義的別名,HAVING因為該SELECT子句在其他子句之后進行評估。
首先使用子查詢定義別名,然后在外部查詢中使用別名:
SELECT ticket,
SUM(amt/100),
COUNT(*)
FROM (
SELECT CASE
WHEN amt_1 >= 10000000 THEN 'R100000'
WHEN amt_1 >= 9000000 THEN NULL
WHEN amt_1 >= 8000000 THEN 'R090000'
WHEN amt_1 >= 7000000 THEN 'R080000'
WHEN amt_1 >= 6000000 THEN 'R070000'
WHEN amt_1 >= 5000000 THEN 'R060000'
WHEN amt_1 >= 4000000 THEN 'R050000'
WHEN amt_1 >= 3000000 THEN 'R040000'
WHEN amt_1 >= 2000000 THEN 'R030000'
WHEN amt_1 >= 1000000 THEN 'R020000'
WHEN amt_1 >= 500000 THEN 'R010000'
WHEN amt_1 >= 100000 THEN 'R005000'
WHEN amt_1 < 100000 THEN 'R001000'
END as Ticket,
amt
FROM BASE24.PTLF
)
GROUP BY Ticket;
或者,重復該CASE運算式,以免參考別名:
SELECT CASE
WHEN amt_1 >= 10000000 THEN 'R100000'
WHEN amt_1 >= 9000000 THEN NULL
WHEN amt_1 >= 8000000 THEN 'R090000'
WHEN amt_1 >= 7000000 THEN 'R080000'
WHEN amt_1 >= 6000000 THEN 'R070000'
WHEN amt_1 >= 5000000 THEN 'R060000'
WHEN amt_1 >= 4000000 THEN 'R050000'
WHEN amt_1 >= 3000000 THEN 'R040000'
WHEN amt_1 >= 2000000 THEN 'R030000'
WHEN amt_1 >= 1000000 THEN 'R020000'
WHEN amt_1 >= 500000 THEN 'R010000'
WHEN amt_1 >= 100000 THEN 'R005000'
WHEN amt_1 < 100000 THEN 'R001000'
END as Ticket,
SUM(amt/100),
COUNT(*)
FROM BASE24.PTLF
)
GROUP BY
CASE
WHEN amt_1 >= 10000000 THEN 'R100000'
WHEN amt_1 >= 9000000 THEN NULL
WHEN amt_1 >= 8000000 THEN 'R090000'
WHEN amt_1 >= 7000000 THEN 'R080000'
WHEN amt_1 >= 6000000 THEN 'R070000'
WHEN amt_1 >= 5000000 THEN 'R060000'
WHEN amt_1 >= 4000000 THEN 'R050000'
WHEN amt_1 >= 3000000 THEN 'R040000'
WHEN amt_1 >= 2000000 THEN 'R030000'
WHEN amt_1 >= 1000000 THEN 'R020000'
WHEN amt_1 >= 500000 THEN 'R010000'
WHEN amt_1 >= 100000 THEN 'R005000'
WHEN amt_1 < 100000 THEN 'R001000'
END;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/367868.html
下一篇:基于多個LOV限制LOV
