我有一个现有的问题,我认为会引导我的答案,但现在我还有另一个问题,我不确定如何解决它。我原来的问题在这里:How to find Invoice detail counter column not in numeric order在我的表格中,当我运行查询时,我有以下信息
Select * from Invoice_detail where Description like 'Service%'
结果:
Detail_ID date_Created Invoice_id Description
1 1/1/18 12:02:03 1 Service 1
2 1/1/18 12:02:04 1 Service 2
3 1/1/18 12:02:05 1 Service 3
4 1/1/18 12:06:03 2 Service 1
5 1/1/18 12:06:04 2 Service 2
6 1/1/18 12:06:05 2 Service 3
7 1/1/18 12:08:03 3 Service 1
8 1/1/18 12:08:04 3 Service 2
9 1/1/18 12:08:05 3 Service 3
10 1/1/18 12:12:03 4 Service 1
12 1/1/18 12:12:05 4 Service 3
13 1/1/18 12:15:05 5 Service 1
15 1/1/18 12:15:05 5 Service 2
Select * from Invoice_Detail returns
:
Detail_ID date_Created Invoice_id Description
1 1/1/18 12:02:03 1 Service 1
2 1/1/18 12:02:04 1 Service 2
3 1/1/18 12:02:05 1 Service 3
4 1/1/18 12:06:03 2 Service 1
5 1/1/18 12:06:04 2 Service 2
6 1/1/18 12:06:05 2 Service 3
7 1/1/18 12:08:03 3 Service 1
8 1/1/18 12:08:04 3 Service 2
9 1/1/18 12:08:05 3 Service 3
10 1/1/18 12:12:03 4 Service 1
12 1/1/18 12:12:05 4 Service 3
13 1/1/18 12:15:05 5 Service 1
14 1/1/18 12:15:05 5 Test
15 1/1/18 12:15:05 5 Service 2
我最初问题的查询 - 我正在运行:
select id.invoice_id
from invoice_detail id
where Description like ('Service%')
group by id.invoice_id
having count(*) <> max(id.detail_id) - min(id.detail_id) + 1;
在我的previoius问题中回答的这个查询正是我所要求的 - 但是,我发现了一些特殊情况,这个问题突然出现了。
我只想返回invoice_ID
4只(上图)在这种情况下 - Detail_ID&#39; 11&#39;不存在,可能被删除。我不希望看到Invoice_id 5,因为detail_id
存在,而不是那张票。
我几乎以为我也需要这样的东西: SQL: find missing IDs in a table
答案 0 :(得分:0)
如果我理解正确,您可以删除where
:
select id.invoice_id
from invoice_detail id
group by id.invoice_id
having count(*) <> max(id.detail_id) - min(id.detail_id) + 1 and
sum(case when Description not like 'Service%' then 1 else 0 end) = 0;
第二个条件确保您想要的服务的所有行。
答案 1 :(得分:0)
WHERE过滤聚合中的内容,HAVING过滤聚合本身。你正在使用HAVING做一些真正属于WHERE的事情,所以试试这个(编辑注意:我刚试过这个,它确实有效):
select id.invoice_id
from invoice_detail id
where Description like ('Service%')
and id.invoice_id in
(
select id.invoice_id
from invoice_detail id
group by id.invoice_id
having count(*) <> max(id.detail_id) - min(id.detail_id) + 1
)
group by id.invoice_id;
希望这有帮助。