我的表格如下:
declare @temp table(
PkId int,
DetailId int,
Type int
)
insert into @temp(PkId,DetailId,[Type])
select 1,1,5
union
select 2,1,3
union
select 3,1,4
union
select 4,2,5
union
select 5,3,5
union
select 6,3,3
select * from @temp order by DetailId
给我回报
PkId DetailId TypeID
1 1 5
2 1 3
3 1 4
4 2 5
5 3 5
6 3 3
获取记录的条件是
我希望输出为
2 1 3
3 1 4
4 2 5
6 3 3
请帮我查询。
答案 0 :(得分:0)
我不理解规则的含义,如果不是一些sql难题,但是可以使用SQLServer 2008的窗口函数来编写它们
WITH C AS (
SELECT pkId, DetailId, typeID
, _34 = SUM(CASE WHEN TypeID IN (3, 4) THEN 1 ELSE 0 END)
OVER (PARTITION BY DetailId)
, _5 = SUM(TypeID) OVER (PARTITION BY DetailId)
FROM Table1
)
SELECT pkId, DetailId, typeID
FROM C
WHERE (_34 > 0 AND TypeID <> 5)
OR (_5 = 5)
对于DetaildID
组的每一行:
TypeID
3或TypeID
4,TypeID
为5 ,则在主查询的WHERE
条件中使用这些值来过滤数据。第二个条件(_5 = 5)
不检查_34
的价值,因为它已经隐含了。
如果TypeID
的值不同于3,4或5,则可能存在回退条件,查询原样将在3或4 (_34 > 0 AND TypeID <> 5)
的组中返回它们,否则将其删除{ {1}}。
答案 1 :(得分:-1)
select pkid, detailid, type
from temp
where type <> 5
group by pkid, detailid, type
union
select pkid, detailid, type
from temp
where detailid not in (
select detailid
from temp
where type <> 5
group by pkid, detailid, type
)
order by pkid