2016-08-25 81 views
-1

我的客戶在每個提交的項目中提交發票。我想計算完成的發票號碼(其中所有的數據項都受到操作員檢查)SQL:選中已檢查所有項目的已完成發票計數

樣本數據:

invoiceNumber |  ItemNumber |  Status 
a      1     Null 
a      2     checked 
a      3     Null 
b      1     checked 
b      5     checked 

在上述採樣數據,成品發票的數量是1,因爲在發票號碼的所有項目檢查「B」且未完成的發票數量爲1,因爲在發票「A」中,只檢查了1個項目。

我嘗試:

select count(distinct invoiceNumber) as total 
from invoices 
where status is not null 

返回2!我不應該算第2行,因爲1和3仍然是空的。

+1

您正在使用哪些DBMS? –

+0

指定預期結果(使用與表格數據相同的格式。) – jarlh

+0

預期結果不是記錄集。即時尋找「1」 –

回答

1

使用下面的查詢..

SELECT count(distinct invoiceNumber) as total 
    FROM from invoices 
     WHERE invoiceNumber NOT IN (SELECT invoiceNumber 
    FROM invoices WHERE status IS null) 
1

distinct是問題所在,因爲您將invoiceNumber作爲結果的唯一外觀。由於有兩個b s被檢查和一個a,計數是2

嘗試使用select count (*)代替或發票的某個唯一ID(如果有)。

編輯: 我誤解了你的問題。要僅計算已檢查狀態的所有行的發票,可以使用group byhaving

類似的東西來:

select count(distinct invoiceNumber) as total 
from invoices 
group by invoiceNumber, status 
having status is not null 
+0

這仍然會在結果中包含invoicenumber'a' –

1

你需要排除有相同invoicenumber一個NULL狀態的所有發票:

select count(distinct i1.invoicenumber) 
from invoices i1 
where not exists (select * 
        from invoices i2 
        where i2.invoicenumber = i1.invoicenumber 
        and i2.status is null); 

另一種選擇是使用except刪除那些空值狀態:

select count(*) 
from (
    select invoicenumber 
    from invoices 
    except 
    select invoicenumber 
    from invoices 
    where status is null 
);