根据状态选择数据 - 有时必须接受某种状态

时间:2013-10-17 13:28:56

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

假设我有一个具有以下结构的表格:

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

希望这能使我的意图更加清晰

2 个答案:

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