2017-10-02 13 views
0

この表には、試験の対象となった生徒の名前が、いつ実行されたか、いつ実行されたかが格納されます。そのタイムラインは年間を通じて一貫しているので、重複したレコードが存在する可能性があります。科目は静的な2(数学、科学)です。私は、1年を通して各サブで失敗した回数をカウントする必要があります。異なるアイテムの出現回数をカウントします。

私のクエリ:

select a.name, 
     (select count(*) 
      from student 
     where name = a.name 
      and subject = 'maths' 
     ) as maths, 
     (select count(*) 
      from student 
     where name = a.name 
      and subject = 'science' 
     ) as science 
    from student a 
group by name 

私のクエリは動作しますが、対象者の数が2つ以上あるとき、それは効率的ではありません。 P.P.私はテーブルの構造が良いことを知っている。 ?しかし、これは課題です。 enter image description here

EDIT:問題は、被験者の数が約10であることです。それから最高のクエリは何ですか?そのような配列や別のテーブルにそれらを格納する必要がありますか?

ありがとうございました!幸せな一日:)

+0

私はあなたに答えを教えてもらえますか?ところで、この問題に関する答えはたくさんあります(ピボットテーブルを参照してください) –

答えて

1

ユースケースの表現を持っている:)、ここであなたは()

select a.name 
    , SUM(case when subject = 'maths' then 1 else 0 end) as maths 
    , SUM(case when subject = 'science' then 1 else 0 end) as science 
from student a 
group by a.name 

か(COUNTを利用する){NULLをカウントしない}

select a.name 
    , COUNT(case when subject = 'maths' then 1 end) as maths 
    , COUNT(case when subject = 'science' then 1 end) as science 
from student a 
group by a.name 
SUMを使用することができます

を使用するか、COUNT()を使用する際に "else NULL"を含めることができます

+0

mysql sum(subject = 'maths') ' –

+0

のほうがずっとシンプルです。簡単なコードは常にベストコードではありません。 –

+0

件名が約10件のときはどうしますか?時間のおかげでbtw :) –

関連する問題