假设我有一个具有以下结构的表格:
ID |日期|名称|状态|属性A |属性B
现在我想从该表格中选择所有行 - 但是,如果有两个来自相同数据且具有相同名称的项目 - 其中一个具有CANCLED状态,那么我只想显示那个没有status=CANCLED
。
但是,如果给定日期只有一个项目,那个名称 - 那么无论状态如何,我都想选择它。
目前我对解决方案视而不见 - 我唯一能想到的就是混合存储过程,临时表和大量if / else语句。但是 - 我很确定必须有办法解决这个问题 - 可能是在一个相当简单的查询中。
谢谢!
编辑:示例数据
ID Date Name Status Attribute A Attribute B
----------- ---------- ----------- ---------- ----------- -----------
1 2013-10-17 A Complete AA BB
2 2013-10-17 A Cancled CC DD
3 2013-10-18 A Cancled DD EE
4 2013-10-18 B Complete AA BB
创建表的脚本(根据某些人的要求):
CREATE TABLE [dbo].[StackoverflowTest](
[ID] [int] NOT NULL,
[Date] [date] NULL,
[Name] [varchar](50) NULL,
[Status] [varchar](10) NULL,
[Attribute A] [nchar](10) NULL,
[Attribute B] [nchar](10) NULL,
)
根据上面的数据 - 我要返回的行是具有以下ID的行:1,3,4
希望这能使我的意图更加清晰
答案 0 :(得分:1)
你可以使用带有row_number()函数的公用表表达式
with cte as (
select
*,
row_number() over(
partition by Date, Name
order by case when status = 'Cancled' then 1 else 0 end
) as rn
from Table1
)
select
ID, Date, Name, Status, [Attribute A], [Attribute B]
from cte
where rn = 1
但是,如果有多个记录具有相同的日期,名称和状态<> 'CANCELED',查询将只返回一个任意行。
<强> => sql fiddle demo 强>
答案 1 :(得分:0)
这假设其他状态值的排序不低于&#39;已取消&#39;
select max([date]) as [date], [name], max([Status]), [Attribute A], [Attribute B]
From [YourTableName]
group by [Name],[Attribute A], [Attribute B]