2016-11-18 58 views
0

我有1个包含票证信息的表格,另一个包含知识文章信息。 门票可以链接到相应的知识文章。如何在COUNT中包含0个结果()

在票据表(IncidentsM1)中是一列CBA_KPF_ID,它将包含文章ID或NULL。

我需要找出每一篇文章了多少次联即使是0

表(节录):

  • INCIDENTSM1 - 票务表
    • INCIDENT_ID - 票务ID
    • CBA_KPF_ID - Article ID
  • KMDOCUMENTM1 - 第表
    • ID - 文章编号

如果我使用下面的代码,我得到的,除了那些0链接的链接数量:

SELECT KM1.ID, COUNT(*) AS "Count" 
FROM INCIDENTSM1 AS SD LEFT JOIN KMDOCUMENTM1 AS KM1 ON SD.CBA_KPF_ID=KM1.ID 
GROUP BY KM1.ID 

其中一个结果是ID值为NULL,并且没有链接到文章的票数。

如果我使用以下(从其他question)的代码,我得到的与统计要么是出现在多个行1个或0和物品ID的文章的列表:

SELECT SD.CBA_KPF_ID, ISNULL(KM."Count", 0) FROM 
(SELECT CBA_KPF_ID FROM INCIDENTSM1) SD 
LEFT JOIN 
(SELECT ID, count(ID) as "Count" FROM KMDOCUMENTM1 GROUP BY ID) KM 
ON SD.CBA_KPF_ID=KM.ID 
ORDER BY "Count" DESC 

是否有可能得到文章列表和他们连接了多少次,即使这个数字是0?

编辑:

我都试过下面的答案,但他们要么未能按ID或仍然没有显示0值。

我只是试图生成列表没有0值,那么工会的表不是在第一个语句的所有ID:这里

(SELECT KM1.ID, COUNT(*) AS "Count" 
FROM INCIDENTSM1 AS SD LEFT JOIN KMDOCUMENTM1 AS KM1 ON SD.CBA_KPF_ID=KM1.ID 
GROUP BY KM1.ID) 

UNION 

SELECT KM.ID, 0 
FROM KMDOCUMENTM1 AS KM 

WHERE KM.ID NOT IN (
SELECT A.ID FROM 
(SELECT KM1.ID, COUNT(*) AS "Count" 
FROM INCIDENTSM1 AS SD LEFT JOIN KMDOCUMENTM1 AS KM1 ON SD.CBA_KPF_ID=KM1.ID GROUP BY KM1.ID) A 
) 
ORDER BY "Count" DESC 

问题是一切低于UNION似乎没有任何回报。

回答

0

比方说,你有如下表:

DECLARE @DataSource01 TABLE 
(
    [ID] TINYINT 
    ,[RefID] TINYINT 
); 

DECLARE @DataSource02 TABLE 
(
    [RefID] TINYINT 
); 

INSERT INTO @DataSource01 ([ID], [RefID]) 
VALUES (1, 1) 
     ,(1, 2) 
     ,(1, 3) 
     ,(2, NULL) 
     ,(2, NULL) 
     ,(3, 1) 
     ,(3, 2) 
     ,(3, NULL); 

INSERT INTO @DataSource02 ([RefID]) 
VALUES (1), (2), (3); 

的数据是:

SELECT * 
FROM @DataSource01 DS1 
LEFT JOIN @DataSource02 DS2 
    ON DS1.[RefID] = DS2.[RefID]; 

enter image description here

所以,我想你需要备案1计数3计数记录2为0,记录3为2:

SELECT DS1.[ID] 
     ,SUM(IIF(DS2.[RefID] IS NULL, 0, 1)) 
FROM @DataSource01 DS1 
LEFT JOIN @DataSource02 DS2 
    ON DS1.[RefID] = DS2.[RefID] 
GROUP BY DS1.[ID] 

enter image description here

注意,如果在你的SQL Server verstion不支持IIF功能,您可以用CASE WHEN expresion改变它。

+0

想这一点,但仍然没有返回任何0值。 只是用另一次尝试更新了问题。 –

+0

你能告诉我一些样本数据(你可以使用我创建的表)和预期的结果吗? – gotqn

0

试试这个

SELECT KM1.ID,IFF(COUNT(*) is null,0,1) AS "Count" 
FROM INCIDENTSM1 AS SD LEFT JOIN KMDOCUMENTM1 AS KM1 ON SD.CBA_KPF_ID=KM1.ID 
GROUP BY KM1.ID 
+0

在此查询中不会计入ID。我得到的行数与链接的文章数量相同,但是每个计数器都是1。 –

+0

我想你的意思是说IIF(COUNT(*)为空,0,COUNT(*)),但是这给了我和我的问题中第一部分代码完全相同的结果。 –

0

如果算上非空左手边应该算行,如果算上右边应该只计算比赛

SELECT KM1.ID, COUNT(SD.CBA) AS CountAll, COUNT(KM1.ID) AS "CountMatches" 
FROM INCIDENTSM1 AS SD LEFT JOIN KMDOCUMENTM1 AS KM1 ON SD.CBA_KPF_ID=KM1.ID 
GROUP BY KM1.ID 
相关问题