2013-10-17 34 views
1

比方说,我有一个具有以下结构的表格:根据状态选择数据 - 有时必须接受某些状态

ID |日期|名称|状态|属性A |属性B

现在我想从tabel中选择所有行 - 但是,如果有两个来自同一数据并具有相同名称的项目 - 其中一个具有状态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

刚做了SELECT * FROM tbl WHERE [status] <>'Cancled''?请显示一些示例数据和显示的输出。另外你已经尝试过的任何东西都会很好。 –

回答

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 

但是,如果有一个以上的记录与同一日期,姓名和状态<>“已取消”,查询将返回唯一的一个任意行。

=> sql fiddle demo

+0

你的查询完全是我要找的。非常感谢! – klausk

0

这假定其他状态值不处于较低顺序的α比“已取消”。

select max([date]) as [date], [name], max([Status]), [Attribute A], [Attribute B] 
From [YourTableName] 
group by [Name],[Attribute A], [Attribute B] 
+0

生成脚本以创建包含数据的表并将其发布;这将允许其他人帮助你找出一个可行的解决方案。 – bsivel