2013-11-27 52 views
10

正如問題所述,我試圖制定一個在列結果中有一個case語句的查詢,然後我想通過查詢的組中包含該列聲明。舉一個具體的例子,這裏是所有稍微分析一下我的查詢看起來像:如何在組中使用Case Statement列

SELECT SOME_TABLE_ALIAS.COLUMN1, OTHER_TABLE_ALIAS.COLUMN2, 
CASE 
    WHEN SOME_TABLE_ALIAS.COLUMN3 IS NOT NULL THEN 'A' 
    ELSE 'B' 
END AS CASE_COLUMN 
FROM SOME_TABLE SOME_TABLE_ALIAS 
... (other table joins and where clauses) 
GROUP BY SOME_TABLE_ALIAS.COLUMN1, OTHER_TABLE_ALIAS.COLUMN2, CASE_COLUMN 

前來到這裏,我檢查了幾個網站,包括this one,試圖解決我的問題。我試過在關聯網頁中顯示CASE關鍵字之後添加另一個別名,但沒有運氣。該錯誤消息我繼續收到如下:

[Error] Script lines: 127-151 ---------------------- 
CASE_COLUMN IS NOT VALID IN THE CONTEXT WHERE IT IS USED. SQLCODE=-206, SQLSTATE=42703, DRIVER=3.53.71 

有沒有其他人遇到我面對並已經能夠使用上CASE語句的結果GROUP BY的問題是什麼?任何幫助,將不勝感激。哦,還有DB2版本的z/OS實例,第10版(DSN10015)

回答

17

別名是不可用的組使用BY,因爲當GROUP BY發生別名沒有定義尚未:

Here's the order: 
1.FROM 
2.WHERE 
3.GROUP BY 
4.HAVING 
5.SELECT 
6.ORDER BY 

您可以解決與:

SELECT column1,column2,case_column 
FROM (
SELECT SOME_TABLE_ALIAS.COLUMN1, OTHER_TABLE_ALIAS.COLUMN2, 
CASE 
    WHEN SOME_TABLE_ALIAS.COLUMN3 IS NOT NULL THEN 'A' 
    ELSE 'B' 
END AS CASE_COLUMN 
FROM SOME_TABLE SOME_TABLE_ALIAS 
... (other table joins and where clauses) 
) a 
GROUP BY COLUMN1, COLUMN2, CASE_COLUMN 

或者只是使用您在SELECT在GROUP使用由

+0

正確。然而,只要澄清一下,在[IBM的說法]中,如果你說'FROM some_table as sta',那麼'sta'將在[FROM table-reference]中被稱爲「相關名稱」(http://pic.dhe.ibm。 com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0059206.html),而不是[「alias」name](http://pic.dhe.ibm .COM /信息中心/ db2luw/v10r5 /主題/ com.ibm.db2.luw.sql.ref.doc/DOC/r0000910.html)。但是這指出,正如你自己的答案所顯示的那樣,在GROUP BY之前首先計算FROM子句(帶有相關名稱)。 – WarrenT

6

您可以通過使用情況下,該組中,這樣的:

SELECT SOME_TABLE_ALIAS.COLUMN1, OTHER_TABLE_ALIAS.COLUMN2, 
CASE 
    WHEN SOME_TABLE_ALIAS.COLUMN3 IS NOT NULL THEN 'A' 
    ELSE 'B' 
END AS CASE_COLUMN 
FROM SOME_TABLE SOME_TABLE_ALIAS 
... (other table joins and where clauses) 
GROUP BY SOME_TABLE_ALIAS.COLUMN1, OTHER_TABLE_ALIAS.COLUMN2, 
CASE 
    WHEN SOME_TABLE_ALIAS.COLUMN3 IS NOT NULL THEN 'A' 
    ELSE 'B' 
END 

或使用子查詢像這樣:

select COLUMN1, COLUMN2, CASE_COLUMN 
from (
    SELECT SOME_TABLE_ALIAS.COLUMN1, OTHER_TABLE_ALIAS.COLUMN2, 
    CASE 
     WHEN SOME_TABLE_ALIAS.COLUMN3 IS NOT NULL THEN 'A' 
     ELSE 'B' 
    END AS CASE_COLUMN 
    FROM SOME_TABLE SOME_TABLE_ALIAS 
    ... (other table joins and where clauses) 
) a 
GROUP BY COLUMN1, COLUMN2, CASE_COLUMN 
+0

這個答案的情況下和Filipe的幾乎在同一時間來到了,不幸的是我只能選一個。這個答案也很有幫助,謝謝。 – butallmj