Sql-Server

如果記錄不存在,如何使用 group by 獲取計數 0?

  • February 4, 2020

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 INcaluse 中時,它的顯示數據不顯示,否則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 

您首先要求查詢引擎做的是:

  1. 獲取所有tblCategory記錄
  2. 查找所有相關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需要 equal tblEvent.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             |
+-------------------------+---------------------+------------------+

這個結果集應該返回你正在尋找的值,或者至少讓你更接近。

這是否為您提供了您正在尋找的指導?

引用自:https://dba.stackexchange.com/questions/241545