2013-11-27 23 views
10

Soruda belirtildiği gibi, sütun sonuçlarında bir durum bildirimi olan bir sorguyu formüle etmeye çalışıyorum ve sonra bu sütunu sorgu grubundaki gruba eklemek istiyorum. Beyan. Somut bir örnek vermek gerekirse, burada sorgu neye benzediğini hepsi biraz:Grup İçinde Durum Açıklama Sütunu Nasıl Kullanılır

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 

Buraya gelirken benim sorunu çözmeye çalışmak, this one dahil olmak üzere birkaç web siteleri, kontrol etti. Bağlantılı web sayfasında gösterildiği gibi CASE anahtar kelimesinin ardından başka bir takma ad eklemeyi denedim, ancak şansım olmadı. Ben almaya devam hata mesajı şudur:

[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 

Ben bakan ve CASE açıklamada sonuçları hakkında bir GROUP BY kullanabildiğinizden ediyorum sorunları başkasının çalıştırmak mı? Herhangi bir yardım takdir edilecektir.

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 

veya alt sorgu kullanın: Oh, ve DB2 sürümü Sen olarak bu gibi gruptaki davayı kullanabilirsiniz ya

cevap

17

takma GRUBU TARAFINDAN takma olur çünkü zaman GROUP BY kullanmak kullanılamaz henüz tanımlanmadı:

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 

Yoksa sadece

+0

Doğru. Ancak, [IBM parlance] 'te,' some_table 'den' 'sta' 'demeniz durumunda açıklığa kavuşturmak için,' sta ', [FROM table-reference] [http://pic.dhe.ibm]' de "korelasyon adı" olarak adlandırılır. Bir ['takma ad] adı yerine, com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0059206.html) (http://pic.dhe.ibm) .com/infocenter/db2luw/v10r5/konu/com.ibm.db2.luw.sql.ref.doc/doc/r0000910.html). Ancak bu, kendi cevabınızın gösterdiği gibi, FROM yan tümcesinin (korelasyon ismiyle) ilk önce GROUP BY'den önce değerlendirildiğine işaret etmektedir. – WarrenT

6

az/OS örneği, versiyon 10 (DSN10015) 'dir böyle:

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

Bu cevap GROUP BY SELECT kullanmasını konu kullanabilir ve Filipe en içinde hemen hemen aynı zamanda geldi ve ne yazık ki sadece birini seçebilirsiniz:Sen o çalışabilirsiniz. Bu cevap da çok yardımcı, teşekkürler. – butallmj

İlgili konular