2

複数の行と複数の列を持つテーブルがあります。次のようになります。

Name    Description
X         PASS
X         PASS
X         FAIL

1行だけ返してほしい。全員が PASS の場合は PASS を返します。それらの 1 つ以上が FAIL の場合、FAIL を返します。

SQL Server 2008 でこれを達成するための最善の方法は何ですか?

編集: name 列の値は常に同じです。

4

5 に答える 5

4

データベースのインデックスに応じて、一意の名前ごとに 1 つの行を返すと仮定すると、次のパフォーマンスを確認できます。

select 
  name, 
  min([description]) as description
from 
    tableA
group by
name

他のソリューションと比較して

于 2012-07-10T18:29:30.203 に答える
3
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 を返します。

于 2012-07-10T18:26:28.903 に答える
2

これはあなたが見つける最も簡単な解決策です:

SELECT MIN(Description) FROM tbl

が少なくとも 1 つFAILある場合、result列には が含まれFAIL、それ以外の場合は が含まれますPASS

于 2012-07-10T18:30:25.940 に答える
0

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'
于 2012-07-10T18:19:40.687 に答える
0

クエリは次のとおりです。

--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
于 2012-07-11T08:57:34.417 に答える