SQL:选中已完成发票的计数,并检查所有项目

时间:2016-08-25 09:25:06

标签: sql count distinct

我的客户提交发票,每张发票中都包含一些商品。我想计算已完成发票的数量(所有项目都由运营商检查)

示例数据:

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仍然是空的。

3 个答案:

答案 0 :(得分:1)

distinct是问题所在,因为您计算invoiceNumber的独特外观作为结果。由于有两个b已检查且一个a,因此计数为2

尝试使用select count (*)代替发票的某个唯一ID(如果有的话)。

编辑: 我误解了你的问题。要仅计算包含已检查状态的所有行的发票,您可以使用group byhaving

类似于:

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

答案 1 :(得分:1)

使用以下查询..

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

答案 2 :(得分:1)

您需要排除同一发票人具有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
);