2017-08-16 32 views
2

我的數據集是這樣的:SQL:行返回組,其中條件爲真

PNR Action Code 
-----+------------- 
1 | Book 
1 | Exchange 
1 | Cancel 
2 | Book 
2 | Exchange 
3 | Book 
4 | Book 
4 | Cancel 

我想返回所有的行,其中的PNR行爲代碼爲「取消」。所以在這種情況下,PNR的所有行1 & 4.

我試圖使用Where子句,但這不會是正確的,因爲它只會返回行WHERE行爲代碼是「取消」。我的結果應該如下所示:

PNR Action Code 
-----+------------- 
1 | Book 
1 | Exchange 
1 | Cancel 
4 | Book 
4 | Cancel 
+2

什麼是你試圖運行查詢?您可以編輯您的問題以添加此信息。 – Theresa

回答

8

也許從Where子句中的select語句獲得PNR?

Select T1.PNR 
     ,T1.[Action Code] 
From myTable T1 
Where T1.PNR in (
     Select PNR 
     from myTable 
     where [Action Code] = 'Cancel' 
     ) 
+0

是的!這工作。非常感謝:)你讓它聽起來很簡單。 – biviz

+0

@biviz,很高興有幫助。我認爲在創建查詢時,清晰和簡單通常是重要的關注 – Degan

3

我想你需要在你的表中做一個自我INNER JOIN。 類似的東西:

select  b.* 
from  yourtable a 
inner join yourtable b 
on   a.PNR = b.PNR 
where  a.Action_Code = 'Cancel' 
3

我不知道如果我得到你的答案,但我認爲這會幫助你

select * 
from your_table 
where PNR in (select PNR 
       from your_table 
       where Action_Code like 'Cancel') 
+0

這可行,但不需要在這裏使用LIKE。相反,使用'='。 – scsimon

2

可以如下查詢:

Select * from (
    Select *, SmCnt = Sum(case when [Action Code] = 'Cancel' then 1 else 0 end) over(partition by pnr) 
    from #pnrdata 
) a where a.SmCnt > 0 

輸出作爲如下:

+-----+-------------+ 
| PNR | Action Code | 
+-----+-------------+ 
| 1 | Book  | 
| 1 | Exchange | 
| 1 | Cancel  | 
| 4 | Book  | 
| 4 | Cancel  | 
+-----+-------------+ 
0
select * 
from your_table 
where PNR=1 or PNR=4 
+1

這將顯示他想要的結果,但僅僅因爲你知道1或4有'取消'。如果您試圖挑選出在Action Code中包含「取消」的所有PNR,這將無法通過表動態過濾。 – Simon

+0

此外,爲解決OPs問題的原因提供一個簡要解釋很重要。 – wahwahwah

0

您也可以在這裏參加CTE路線。

; with cte as (
    select 
    pnr 
    ,[action code] 
    ,SUM(case 
     when [action code] = 'cancel' then 1 
     else 0 
    end) OVER(partition by pnr order by pnr) as canceledItem 
from test 
) 
select * 
from cte 
where canceledItem = 1 
0

我會寫這樣的,使用熱膨脹係數,使其易於閱讀:

WITH RelevantPNRs AS(
    SELECT DISTINCT PNR 
    FROM [YourTable] 
    WHERE [ActionCode] = 'Cancel' 
) 
SELECT t.* 
FROM [YourTable] t 
    INNER JOIN RelevantPNRs r ON t.PNR = r.PNR 
相關問題