2013-10-17 69 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