複数の行と複数の列を持つテーブルがあります。次のようになります。
Name Description
X PASS
X PASS
X FAIL
1行だけ返してほしい。全員が PASS の場合は PASS を返します。それらの 1 つ以上が FAIL の場合、FAIL を返します。
SQL Server 2008 でこれを達成するための最善の方法は何ですか?
編集: name 列の値は常に同じです。
複数の行と複数の列を持つテーブルがあります。次のようになります。
Name Description
X PASS
X PASS
X FAIL
1行だけ返してほしい。全員が PASS の場合は PASS を返します。それらの 1 つ以上が FAIL の場合、FAIL を返します。
SQL Server 2008 でこれを達成するための最善の方法は何ですか?
編集: name 列の値は常に同じです。
データベースのインデックスに応じて、一意の名前ごとに 1 つの行を返すと仮定すると、次のパフォーマンスを確認できます。
select
name,
min([description]) as description
from
tableA
group by
name
他のソリューションと比較して
SELECT TOP 1 CASE Description WHEN 'FAIL' THEN 'FAIL' ELSE 'PASS' END
FROM DaTable
ORDER BY Description
OP: テーブルが空である可能性はありますか? その場合、このクエリは明らかに行を返しません。
編集
aquinas のコメントによると、注文せずに変更されたクエリを作成しました。
SELECT CASE COUNT(Description) WHEN 0 THEN 'FAIL' ELSE 'PASS' END
FROM DaTable
WHERE Description = 'FAIL'
DaTable が空の場合、このクエリは PASS を返します。
これはあなたが見つける最も簡単な解決策です:
SELECT MIN(Description) FROM tbl
が少なくとも 1 つFAIL
ある場合、result
列には が含まれFAIL
、それ以外の場合は が含まれますPASS
。
EXISTS
「FAIL」を含む行の存在を取得するために使用できます。
次のようなことも試すことができます。
SELECT TOP 1 COALESCE(tFail.Description,t.Description)
FROM myTable AS t
LEFT JOIN myTable AS tFail ON tFail.Name = t.Name AND tFail.Description = 'FAIL'
WHERE t.Name = 'x'
クエリは次のとおりです。
--DROP TABLE result
CREATE TABLE result(Name varchar(10),Description varchar(20))
--select * from result
INSERT INTO result
VALUES('X','PASS'),('X','PASS'),('X','FAIL')
;WITH CTE(descp,cnt) as (SELECT [description],COUNT(*) as cnt FROM result group by [description])
SELECT CASE WHEN COUNT(*) > 1 then 'FAIL' when COUNT(*)=1 then MAX(descp) else 'PASS' END FROM CTE