如果記錄不存在,如何使用 group by 獲取計數 0?
count=0
我有 sql server 查詢,如果記錄不存在,我想獲取。我想顯示表中的所有內容,如果不存在則category
顯示所有類別。但如果 where子句count 0
中不存在記錄,則返回空。IN
SELECT TC.DESCRIPTION,count(TE.CategoryID) AS COUNT FROM tblEvent TE right JOIN tblCategory TC on TE.CategoryID=TC.NO WHERE TE.AssetID IN ( SELECT ASSET_NO FROM tblAsset WHERE EQUIPMENT_ID=3) GROUP BY TE.CategoryID,TC.DESCRIPTION
我
categories
也想用計數 0 顯示類別表中的所有內容。對不起,我無法解釋更多,希望能理解。我也嘗試了所有連接left,right,left out,right outer
,但它顯示為空,但是當記錄存在於WHERE IN
caluse 中時,它的顯示數據不顯示,否則count 0
根據類別表。
哈米德,
我相信您面臨的挑戰是您將
IN()
命令用作WHERE
過濾器應用於“條件表”時的一部分。(如果我們使用 a 重新編寫查詢
LEFT OUTER JOIN
並進行一些輕微的重新格式化以幫助我更好地查看它。)SELECT TC.DESCRIPTION, count(TE.CategoryID) AS COUNT FROM tblCategory TC LEFT OUTER JOIN tblEvent TE on TE.CategoryID=TC.NO WHERE TE.AssetID IN ( SELECT ASSET_NO FROM tblAsset WHERE EQUIPMENT_ID=3 ) GROUP BY TE.CategoryID,TC.DESCRIPTION
您首先要求查詢引擎做的是:
- 獲取所有
tblCategory
記錄- 查找所有相關
tblEvent
記錄tblEvent.CategoryID = tblCategory.NO
這最終會創建一些看起來像這樣的東西(我的表中實際存在的數據類型可能有誤,但我只是想傳達一個概念):
+-------------------------+---------------------+------------------+ | tblCategory.Description | tblEvent.CategoryID | tblEvent.AssetID | +-------------------------+---------------------+------------------+ | Test | 1 | 1 | | Test 1 | 1 | 1 | | Other | 2 | 1 | | Other 1 | 3 | 1 | | A | 3 | 2 | | B | 3 | 2 | | C | 4 | 2 | | D | 4 | 2 | | E | NULL | NULL | | F | NULL | NULL | | G | 6 | 3 | | H | 6 | 3 | | I | 6 | 4 | | J | 6 | 5 | +-------------------------+---------------------+------------------+
應用條件後
WHERE
,整個結果集將被過濾以僅顯示具有適當tblEvent.AssetID
. 為了這個例子,假設SELECT ASSET_NO FROM tblAsset WHERE EQUIPMENT_ID=3
只返回“1”和“2”的值。然後剩下的(在應用GROUP BY
然後的COUNT
部分之前)是:+-------------------------+---------------------+------------------+ | tblCategory.Description | tblEvent.CategoryID | tblEvent.AssetID | +-------------------------+---------------------+------------------+ | Test | 1 | 1 | | Test 1 | 1 | 1 | | Other | 2 | 1 | | Other 1 | 3 | 1 | | A | 3 | 2 | | B | 3 | 2 | | C | 4 | 2 | | D | 4 | 2 | +-------------------------+---------------------+------------------+
如果您稍微修改查詢並將此
WHERE
條件作為結果集的一部分,JOIN
您的結果集將會有所不同,但您不會失去tblCategory
記錄。發生這種情況是因為所有tblCategory
記錄都保持不變(因為我們正在LEFT OUTER JOIN
執行(這與 just 相同LEFT JOIN
,我也喜歡使用這個OUTER
詞))但是,不僅tblEvent.CategoryID
需要 equaltblEvent.NO
。但tblEvent.AssetID
也必須匹配的結果SELECT ASSET_NO FROM tblAsset WHERE EQUIPMENT_ID=3
才能重回正軌SELECT
。SELECT TC.DESCRIPTION, count(TE.CategoryID) AS COUNT FROM tblCategory TC LEFT OUTER JOIN tblEvent TE on TE.CategoryID=TC.NO AND TE.AssetID IN ( SELECT ASSET_NO FROM tblAsset WHERE EQUIPMENT_ID=3 ) GROUP BY TE.CategoryID,TC.DESCRIPTION
GROUP BY
這應該在執行你的和部分之前返回下表COUNT
(再次假設SELECT ASSET_NO FROM tblAsset WHERE EQUIPMENT_ID=3
只返回'1’和'2’的值):+-------------------------+---------------------+------------------+ | tblCategory.Description | tblEvent.CategoryID | tblEvent.AssetID | +-------------------------+---------------------+------------------+ | Test | 1 | 1 | | Test 1 | 1 | 1 | | Other | 2 | 1 | | Other 1 | 3 | 1 | | A | 3 | 2 | | B | 3 | 2 | | C | 4 | 2 | | D | 4 | 2 | | E | NULL | NULL | | F | NULL | NULL | | G | NULL | NULL | | H | NULL | NULL | | I | NULL | NULL | | J | NULL | NULL | +-------------------------+---------------------+------------------+
這個結果集應該返回你正在尋找的值,或者至少讓你更接近。
這是否為您提供了您正在尋找的指導?