【问题标题】:Can't get rows for zero values in SQL query with COUNT and 3 JOINs (4 tables)无法使用 COUNT 和 3 个 JOIN(4 个表)在 SQL 查询中获取零值的行
【发布时间】:2015-06-10 10:32:23
【问题描述】:

我正在尝试为 CELLNAME 和 LANGUAGE 的每个组合获取一行,但我无法获取零计数的行。例如,如果 CELLNAME 'x' 不包含任何具有语言代码 DE 的 CLIENT_ID 或 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

【问题讨论】:

  • 您需要使用LEFT JOIN 来获取零匹配行的计数。在这种情况下,COUNT(*) 也不起作用 - 这将返回 1,因为在左外连接中将返回一个空行。

标签: sql oracle join count


【解决方案1】:

数据:

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

【讨论】:

  • 感谢您回复本帖。问题是 CLOLANG 在 VWFC_WKCLIE 表中。 TB_PROP_Q 有这些列:QA_ID、CLIENT_ID 和 CELLNAME。
  • 您能提供一些示例数据吗? TKS。
  • TB_PROP_Q CLIENT_ID单元名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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-21
  • 2019-12-22
  • 2011-08-18
  • 1970-01-01
  • 2015-05-29
  • 1970-01-01
相关资源
最近更新 更多