2013-11-27 12 views
10

Come indicato dalla domanda, sto provando a formulare una query che ha un'istruzione case nei risultati della colonna e quindi voglio includere quella colonna nel gruppo della query per dichiarazione. Per fare un esempio concreto, qui è tutto poco di quello che la mia domanda si presenta come:Come utilizzare la colonna di dichiarazione case nel gruppo di

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 

Prima di venire qui, ho controllato un paio di siti web, tra this one, per cercare di risolvere il mio problema. Ho provato ad aggiungere un altro alias dopo che la parola chiave CASE è mostrata nella pagina Web collegata ma non ha avuto fortuna. Il messaggio di errore continuo a ricevere è la seguente:

[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 

Ha chiunque altro correre in problemi che sto affrontando e stato in grado di utilizzare un GROUP BY sui risultati di una dichiarazione CASE? Qualsiasi aiuto sarebbe apprezzato. Oh, e la versione di DB2 è esempio z/OS, versione 10 (DSN10015)

risposta

17

l'alias non è disponibile per l'utilizzo nel GROUP BY perché quando GROUP BY accade l'alias non è ancora definita:

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

È possibile risolvere che con:

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 

o semplicemente usare il caso di utilizzare in SELECT GROUP BY

+0

corretto. Giusto per chiarire comunque, in [parlance IBM] se si dice 'FROM some_table as sta', allora 'sta' verrebbe definito" nome di correlazione "nel [FROM table riferimento] (http://pic.dhe.ibm. com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0059206.html), piuttosto che un nome ["alias"] (http://pic.dhe.ibm .com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0000910.html). Ma questo fa notare che, come mostra la tua risposta, la clausola FROM (con il nome della correlazione) viene valutata per prima, prima di GROUP BY. – WarrenT

6

è possibile utilizzare il caso come è nel gruppo da, in questo modo:

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 

o utilizzare un sub-query in questo modo:

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

Questa risposta e Filipe della venuto in praticamente nello stesso tempo e, purtroppo, posso scegliere solo uno. Questa risposta è anche molto utile, grazie. – butallmj