无法在具有 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
我正在尝试为 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