如何根据条款

时间:2018-01-31 00:07:39

标签: sql sql-server sql-server-2008 sql-server-2012

我有一个现有的问题,我认为会引导我的答案,但现在我还有另一个问题,我不确定如何解决它。我原来的问题在这里: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

2 个答案:

答案 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;

希望这有帮助。