2016-02-23 15 views
-1
與計數返回0,而不是沒有行
I have a query: 

SELECT  Store_Number, COALESCE (COUNT(Invoice_Number), 0) AS abc 
FROM  Invoice_Detail_Tb 
WHERE  (Invoice_Date BETWEEN @start AND @end) AND (Invoice_Detail_Code IN ('abc')) 
GROUP BY Store_Number 

它的返回:如何在SQL

Store Number  ABC 
1     1 
3     23 
4     24 
5     7 

我想它返回:

Store Number  ABC 
1     1 
2     0 
3     23 
4     24 
5     7 

我猜想這是因爲我的「分組依據」。我怎樣才能做到這一點?

+0

添加一個case語句,如果它是空白,返回默認(其他)「0」。那麼無論發生什麼,你都會在該行中獲得一些東西。 – durbnpoisn

+0

我試過......沒有工作。 – Shmewnix

+0

您必須使用另一個表作爲查詢的基表。如果您沒有商店編號爲2的行,查詢不會爲您創建。查找一個理貨或數字表。這就是你想要的。 –

回答

5

最簡單的方法。 。 。如果它有效。 。 。是使用條件聚合而不是where子句。所以,如果所有的商店都在數據,但他們可能沒有「ABC」,然後

SELECT Store_Number, SUM(Invoice_Detail_Code = 'abc' THEN 1 ELSE 0 END) AS abc 
FROM Invoice_Detail_Tb 
WHERE Invoice_Date BETWEEN @start AND @end 
GROUP BY Store_Number; 

的作品更加一致假設你有一個Stores表與LL商店的方法。那麼你只需要一個LEFT OUTER JOIN

SELECT s.Store_Number, COUNT(id.Store_Number) AS abc 
FROM Stores s LEFT OUTER JOIN 
    Invoice_Detail_Tb id 
    ON s.Store_Number = id.Store_Number AND 
     id.Invoice_Date BETWEEN @start AND @end AND 
     id.Invoice_Number = 'abc' 
GROUP BY s.Store_Number;