2016-11-18 81 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 
相關問題