4

私はsometableのテーブルを持っています:

name |test_date | score   
-----------------------
jon  |2012:07:01|   95   
jon  |2012:07:01|   60   
jon  |2012:07:01|   30   
alex |2012:07:01|   80   
alex |2012:07:01|   85   
alex |2011:05:01|   40  
emile|2011:01:01|   89    

名前ごとにいくつかの行を取得し、ルールを使用して彼のscore_gradingに関する情報を提供します:score> 79 = A、80> score> 49 = B、それ以外の場合はC。

問題は、私が欲しいことです。同じ日に、学生に同じscore_gradeが複数ある場合、それは1つのscore_gradeとしてカウントされます。たとえば、表では、alexが1日に2回Aを取得していることがわかります。これは、1Aとしてのみカウントされるようにします。

したがって、結果は次のようになります

name |    A   |    B     |    C
jon  |    1   |    1     |    1
alex |    1   |    0     |    1  
emily|    1   |    0     |    0

私は次のようなコードしか知りません:

SELECT name,
SELECT SUM(IF(score)>79),1,0)) as A,
SELECT SUM(IF(80>score>49),1,0)) as B,
SELECT SUM(IF(score)<50),1,0)) as C from sometable group by name

なぁ、どうやって「DISTINCT」をつけるの?誰かが解決策を与えることができますか?多分それはDISTINCTを必要としませんか?ありがとう。^^

4

2 に答える 2

2

次のような意味ですか(sqlfiddle)?

SELECT name, SUM(IF(A>=1,1,0)) as A, SUM(IF(B>=1,1,0)) as B, 
    SUM(IF(C>=1,1,0)) as C
FROM
(
    SELECT name, test_date, SUM(IF(score>79,1,0)) as A, 
        SUM(IF(score BETWEEN 49 AND 79,1,0)) as B, SUM(IF(score<50,1,0)) as C 
    FROM sometable 
    GROUP BY name, test_date
) daygroups
GROUP BY name

name, test_date, A, B, Cこれは最初にデータをサブクエリのの行にシャッフルします。次に、外部クエリはこれらの行を集約し、その日にその文字グレードのスコアが少なくとも1つある場合は1を取り、それ以外の場合は0を取ります。


これも機能するはずです(sqlfiddle):

SELECT name, SUM(IF(lettergrade = 'A',1,0)) AS A, 
    SUM(IF(lettergrade = 'B',1,0)) AS B, SUM(IF(lettergrade = 'C',1,0)) AS C
FROM
(
    SELECT DISTINCT name, test_date, 
        CASE WHEN score>79 THEN 'A' 
             WHEN score BETWEEN 49 AND 79 THEN 'B' 
             ELSE 'C' 
        END AS lettergrade
    FROM sometable
) lettergrades
GROUP BY name

どちらが良いかわかりません。このクエリは、DISTINCT質問で提案したとおりにを使用します。まず、各数値の成績を対応する文字の成績に解決し、次にDISTINCT重複を取り除きます。最後に、データを列にシャッフルします。

于 2012-07-30T05:06:09.570 に答える
0

これは機能するはずです:

SELECT name,
       SUM(IF(score > 79, 1, 0)) as A,
       SUM(IF(score BETWEEN 50 AND 79, 1, 0)) as B,
       SUM(IF(score < 50, 1, 0)) as C 
FROM   (SELECT DISTINCT name, score FROM sometable) a
GROUP BY name;
于 2012-07-30T04:59:01.207 に答える