2012-03-14 33 views
1

我有我的3個表,並且我想計算所有活動的串行資產。我如何計算活動行數而不是軟刪除數

我需要顯示序列化清單行,但詳細信息可能尚未添加到SerialAssets表,因此這給了我NULL行。 這工作正常,像這樣...

SELECT inv.Id AS Id, COUNT(s.Id) AS Total, MIN(i.Name) AS Asset 
FROM SerialAssets AS s 
RIGHT JOIN Inventories AS inv ON s.InventoryId = inv.Id 
INNER JOIN Items AS i ON inv.ItemId = i.Id 
WHERE i.Serialised = 1 
GROUP BY inv.Id 

但現在我已經加入軟刪除我只需要算活躍SerialAssets,所以添加和s.Active = 1到WHERE的作品,但它消除看重的空通常顯示爲0的行。它顯然是因爲如果s.Active爲null,它沒有被選中,那麼有沒有辦法改變計數或使s.active = 1或null?

UPDATE

要解決:

Damien_The_Unbeliever & 利芬

感謝您的快速答覆!

+0

所以你實際上不需要一個計數,你想篩選你的選擇語句。 – jrummell 2012-03-14 16:22:38

回答

3

添加AND s.Active = 1加入條件,而不是到WHERE子句:

SELECT inv.Id AS Id, COUNT(s.Id) AS Total, MIN(i.Name) AS Asset 
FROM SerialAssets AS s 
RIGHT JOIN Inventories AS inv ON s.InventoryId = inv.Id 
     AND s.Active = 1 
INNER JOIN Items AS i ON inv.ItemId = i.Id 
WHERE i.Serialised = 1 
GROUP BY inv.Id 

的時候了WHERE子句是(邏輯上)評估的,它並不關心結果集中每列的來源是什麼 - 它關心的是評估將這些條件與這些列中的值相比較。如果這些列包含NULL s,它不知道這是因爲該列在基表中包含NULL,還是因爲外部不成功導致JOIN

+0

好的解釋! – cairnz 2012-03-14 13:55:55

+0

哈哈,那很簡單!謝謝 – Luckyl337 2012-03-14 13:56:25

1

如果活動狀態始終爲1,0或爲空,那麼您可以僅使用SUM活動。

一個更通用的解決方案是這樣的

SUM(CASE 
     WHEN /*insert active condition here*/ THEN 1 
     ELSE 0 
    END) AS ActiveCount 
+0

好的...但不知道如何幫助我,我可以有更多的信息 – Luckyl337 2012-03-14 13:40:54

1

更改s.Active= 1要麼

  • ISNULL(s.Active, 1) = 1
  • COALESCE(s.Active, 1) = 1

ISNULL

用指定的替換值替換NULL。

COALESCE

返回其自變量之中的第一個非空的表達。

+0

感謝這也很好,一些非常方便的信息 – Luckyl337 2012-03-14 13:59:06

0

我可能沒有得到的問題......但你是否試圖計數所有s.Id等於1而不過濾查詢返回的行?

如果是這樣的話:

更換count(s.Id)count(case when s.Id = 1 then 1 end)

0

試試這個:

SELECT inv.Id AS Id, 
      SUM(CASE WHEN COALESCE(s.ACtive, 1) = 1 THEN 1 ELSE 0 END) AS Total, 
      MIN(i.Name) AS Asset 
    FROM Inventories AS inv 
      INNER JOIN Items AS i ON inv.ItemId = i.Id 
      LEFT OUTER JOIN SerialAssets AS s ON 
        inv.Id = s.InventoryId 
    WHERE i.Serialised = 1 
    GROUP BY inv.Id 

我已經重新安排你的查詢。相反,最好使用LEFT OUTER JOIN。這對於人類來說更容易理解,並且SQL Server通過LEFT JOIN執行得更快。