我的客户提交发票,每张发票中都包含一些商品。我想计算已完成发票的数量(所有项目都由运营商检查)
示例数据:
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仍然是空的。
答案 0 :(得分:1)
distinct
是问题所在,因为您计算invoiceNumber
的独特外观作为结果。由于有两个b
已检查且一个a
,因此计数为2
尝试使用select count (*)
代替发票的某个唯一ID(如果有的话)。
编辑:
我误解了你的问题。要仅计算包含已检查状态的所有行的发票,您可以使用group by
和having
。
类似于:
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
);