1

試験結果の表が与えられます。ここで、1 ==合格、0==不合格です。


ID    Name    Test   Result
--------------------
1     John    MATH   1
2     John    ENGL   1
3     Mary    MATH   1
4     Mary    PSYC   0

編集:名前が一意であると想定します。



1)すべてのテストに合格した
2)少なくとも1つのテストに失敗した人のすべてのレコードを取得する必要があります

したがって、最初のクエリはジョンと彼のすべてのレコードを返し、2番目のクエリはメアリーと彼女のすべてのレコード(PASSのレコードを含む)を返す必要があります。

自分でを実行してカウントを比較しようとしてLEFT OUTER JOINいますが、クエリが機能していないようです。


SELECT * FROM Results R1
LEFT OUTER JOIN Results R2 on R1.ID=R2.ID and R2.Result=1
WHERE ??? count of rows from R1 is compared to count of non-null rows from R2
4

4 に答える 4

3

EXISTSこれは、条項の「ポスターチャイルド」演習です。

少なくとも1つの失敗した結果:

select * from Results r
where exists (select * from Results rr where rr.Name=r.Name AND Result=0)

すべて合格:

select * from Results r
where not exists (select * from Results rr where rr.Name=r.Name AND Result=0)

これらのクエリがでsqlfiddle.comデータセットに対してどのように機能するかを確認してください。

于 2012-08-17T18:05:32.653 に答える
2

すべて合格

SELECT Name FROM Results R1
GROUP BY NAME
HAVING SUM(RESULT) = COUNT(RESULT)

一部失敗しました

SELECT Name FROM Results R1
GROUP BY NAME
HAVING SUM(RESULT) < COUNT(RESULT)

それが役に立てば幸い

編集

すべて合格

SELECT Name FROM Results R1
GROUP BY NAME
HAVING SUM(1-RESULT) = 0

一部失敗しました

SELECT Name FROM Results R1
GROUP BY NAME
HAVING SUM(1-RESULT) > 0

(これはより速く実行される可能性があります)

于 2012-08-17T18:05:01.420 に答える
1

一方通行

  Select Name, 
     Case failCount When 0 then 'X' Else '' End PassedAll,
     Case failCount When 0 then '' Else 'X' End FailedOneOrMore
  From (Select name, 
        Sum(Case Result when 0 Then 1 Else 0 End) failCount
        From Results R
        Group By Name) Z

すべてのレコードを取得するには、これに参加するだけです

   Select zz.Name, zz.PassedAll, zz.FailedOneOrMore,
      r.Test, r.Result 
   From (Select Name, 
             Case failCount When 0 then 'X' Else '' End PassedAll,
             Case failCount When 0 then '' Else 'X' End FailedOneOrMore
        From (Select name, 
              Sum(Case Result when 0 Then 1 Else 0 End) failCount
              From Results R
              Group By Name) Z) ZZ
       Left Join Results r On r.Name = zz.Name
于 2012-08-17T18:04:29.487 に答える
0

このクエリは、サブクエリを使用して、少なくとも1つのテストに合格した人のすべてのレコード(合格および不合格)を返します。

select * from Results where Name in (select Name from Results where Result = '1' group by Name);

結果には、いずれかのテストに合格しなかった人は含まれません。

于 2012-08-17T18:38:26.857 に答える