无法在具有 COUNT 和 3 个 JOIN(4 个表)的 SQL 查询中获取零值行

Can't get rows for zero values in SQL query with COUNT and 3 JOINs (4 tables)

我正在尝试为 CELLNAME 和 LANGUAGE 的每个组合获取一行,但我无法获取零计数的行。例如,如果 CELLNAME 'x' 不包含任何 CLIENT_ID 或语言代码为 DE 的 CLNOCL,我不会得到计数为零的行。当存在一种或多种任何语言时,这非常有效。使用的数据库是Oracle。 我坚持了一段时间,因为我不太擅长 SQL,如果有人能提供帮助,我将不胜感激。这是查询:

                select QA_ID,MODULE_ID,ATTRIBUTE_ID,ATTRIBUTE_NAME,CELLNAME,CNT

            FROM 

            (SELECT QA_ID,CELLNAME,LANGUE, COUNT(*) CNT 
             FROM (
                                                           select QA_ID,CELLNAME,
                                                                          CASE 
                                                                          WHEN CLOLAN = 'EN' THEN  'ENGLISH' 
                                                                          WHEN CLOLAN = 'DE' THEN 'GERMAN'
                                                                                          ELSE 'UNKNOWN'
                                                                          END as LANGUE    
                                                           from TB_PROP_Q A 

                                                           INNER JOIN VWFC_WKCLIE B
                                                           ON A.CLIENT_ID = B.CLNOCL
                                                           )

            GROUP BY QA_ID,CELLNAME, LANGUE 
            )C
                           INNER JOIN 
                                           (
                                           SELECT A.MODULE_ID,A.MODULE_NAME,B.ATTRIBUTE_NAME,B.ATTRIBUTE_ID
                                           FROM QA_TABLE_MODULE A 
                                           INNER JOIN QA_TABLE_ATTRIBUTE B 
                                           ON A.MODULE_ID=B.MODULE_ID
                                           WHERE MODULE_NAME = 'LANGUE'
                                           )D
            ON C.LANGUE = D.ATTRIBUTE_NAME

数据:

TB_PROP_Q 
CLIENT_ID       CELLNAME    QA_ID 
#ABEG20XA69001  MODELE1_C   20150401152337 
#ACQM679487001  MODELE1_C   20150401152337 
#ATTP6AS979801  MODELE1_A   20150401152337 
#AZIP516667001  MODELE1_C   20150401152337 
#ECLJ5YAHA8XX1  MODELE1_C   20150401152337 
#EVAY429382001  MODELE1_B   20150401152337 
#ICOX189625001  MODELE1_B   20150401152337 
#ORXY5A8780001  MODELE1_B   20150401152337 
#RBAH046697001  MODELE1_C   20150401152337 

VWFC_WKCLIE
CLNOCL          CLOLAN  
#ABEG20XA69001  EN  
#ATTP6AS979801  EN 
#ACQM679487001  DE 
#ICOX189625001  DE  
#ALBK048878001  EN  
#ACQM679487001  EN 

QA_TABLE_MODULE 
MODULE_ID       MODULE_NAME 
1               LANGUE  
2               AGE

QA_TABLE_ATTRIBUTE 
ATTRIBUTE_ID    ATTRIBUTE_NAME  MODULE_ID   
1               GERMAN          1   
2               ENGLISH         1   
3               UNKNOWN         1   
4               0_17_YO         2   
5               18_34_YO        2   
6               35_54_YO        2

你可以先计算语言的数量,然后左连接得到CNT。

SELECT QA_ID,MODULE_ID,ATTRIBUTE_ID,ATTRIBUTE_NAME,CELLNAME,CNT
FROM 
(
    SELECT DISTINCT A.QA_ID,A.CELLNAME,B.LANGUE,nvl(C.CNT,0) AS CNT FROM TB_PROP_Q A
    INNER JOIN
    (
        SELECT 'ENGLISH' AS LANGUE
        UNION
        SELECT 'GERMAN' AS LANGUE
        UNION
        SELECT 'UNKNOWN' AS LANGUE
    )B ON 1=1
    LEFT JOIN
    (
        SELECT QA_ID,CELLNAME,LANGUE, COUNT(*) CNT 
        FROM 
        (
           select QA_ID,CELLNAME,
           CASE 
           WHEN CLOLAN = 'EN' THEN 'ENGLISH' 
           WHEN CLOLAN = 'DE' THEN 'GERMAN'
           ELSE 'UNKNOWN'
           END AS LANGUE    
           FROM TB_PROP_Q A 
           INNER JOIN VWFC_WKCLIE B
           ON A.CLIENT_ID = B.CLNOCL
        )A
        GROUP BY QA_ID,CELLNAME,LANGUE 
    )C ON A.QA_ID=C.QA_ID AND A.CELLNAME=C.CELLNAME AND B.LANGUE=C.LANGUE
)C
INNER JOIN 
(
    SELECT A.MODULE_ID,A.MODULE_NAME,B.ATTRIBUTE_NAME,B.ATTRIBUTE_ID
    FROM QA_TABLE_MODULE A 
    INNER JOIN QA_TABLE_ATTRIBUTE B 
    ON A.MODULE_ID=B.MODULE_ID
    WHERE MODULE_NAME = 'LANGUE'
)D
ON C.LANGUE = D.ATTRIBUTE_NAME

输出:

QA_ID           CELLNAME    LANGUE  CNT
20150401152337  MODELE1_A   ENGLISH 1
20150401152337  MODELE1_A   GERMAN  0
20150401152337  MODELE1_A   UNKNOWN 0
20150401152337  MODELE1_B   ENGLISH 0
20150401152337  MODELE1_B   GERMAN  1
20150401152337  MODELE1_B   UNKNOWN 0
20150401152337  MODELE1_C   ENGLISH 2
20150401152337  MODELE1_C   GERMAN  1
20150401152337  MODELE1_C   UNKNOWN 0