web-dev-qa-db-ja.com

グループ化に同じ値を持つ複数の行が含まれる場合に選択しますか?

結合されたテーブルBの列に、テーブルAの1つの一致する行の複数の異なる値が含まれている場合は常に、テーブルAから1行を返すクエリを記述しようとしています(A-> Bは1->多くの関係です)。これをコンテキストで示すSQLフィドル: http://sqlfiddle.com/#!6/83952/1

このフィドルでは、_perf_ticket_type_テーブルのdesign列は、同じ_ticket_type_を持つすべての_perf_id_で同じでなければなりませんが、そうでないインスタンスのみを選択しようとしていますt。したがって、_perf_id_ 3の場合、現在使用しているクエリで複数の一意のdesignが返されます。

結果として必要なのは、結合されたテーブルの_perf_id_のperformanceの複数の値に基づいて、_perf_id_ 3のみのdesignテーブルの2つの列です。

私は過去にGROUP BYを理解することに不満を感じていたので、目的の結果を得るためにここで何か違うことをすることができるかどうかわかりません。現時点では、一時テーブルにあるフィドルにあるものを選択してからanotherselect onthatGROUP BY perf_id HAVING COUNT(*) > 1を使用して、必要なものを取得します(- 列が複数のレコードに同じデータを含む行を選択 )のように、しかし、それは追加のステップのようです。

5
NReilingh

あなたの考えは正しいですが、HAVING COUNT(DISTINCT design) > 1が必要です

このような:

WITH multi_design_perfs AS
(SELECT b.perf_id 
FROM perf_ticket_type b
GROUP BY b.perf_id
HAVING COUNT(DISTINCT b.design) > 1
)
SELECT m.perf_id, 
    STUFF((select ', ' + CAST(b.design AS varchar(10))
     FROM perf_ticket_type b 
     WHERE b.perf_id = m.perf_id
     ORDER BY b.design
     FOR XML PATH(''), TYPE).value('.','varchar(max)'),1,2,'')
FROM multi_design_perfs m
;
4
Rob Farley