2017-08-16 15 views
2

私のデータセットには、次のようになります。SQL:条件が真の場合に行のリターン・グループは

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

私はアクションコードが「キャンセル」であったPNRSのためのすべての行を返すようにしようとしています。したがって、この場合、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が「キャンセル」を持っていることを知っているので、彼が望む結果を表示するために働くでしょう。アクションコードに「キャンセル」があるすべてのPNRを選択しようとすると、テーブルを動的にフィルタリングすることができません。 – Simon

+0

また、OPの発行を解決する理由について簡単に説明することも重要です。 – 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

私はそれが簡単に読みやすくするためにCTEを使用して、このようにそれを記述します。

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 
関連する問題