0

一連の値をリストする結果テーブルがあり、それぞれが結果が作成された日付を含む別のテーブルにリンクしています。

(CASE を使用して) すべての日付を取得するために SQL を使用していますが、単一の範囲の結果しか取得できません。

    Select 
    count(CASE
    WHEN  results.test_id IN ( SELECT id 
    FROM  `test` 
    WHERE  `posted` 
    BETWEEN  '2011-07-01 00:00:00'
    AND  '2011-07-01 23:59:59') 
    THEN results.test_id
    ELSE NULL
        END) AS "1st July"          
    from `results`
    WHERE results.window_id = 2 and results.mark > 90;

また、すべての範囲を取得する別の SQL クエリもありますが、一度に 1 つの日付に対してしか機能しません。

SELECT
CASE
    when mark > 90 then '>90%'
    when mark > 80 then '>80%'
    when mark > 70 then '>70%'
END as mark_results,
COUNT(*) AS count

FROM (SELECT mark from results where window_id =2) as derived
GROUP BY mark_results
ORDER BY mark_results;

私が望むのは、すべてを 1 つの統一されたクエリにまとめて、結果の範囲ごとに関連する合計を表示することです。以下のように:

Result Range | 1st July | 2nd July | 3rd July | 4th July
>90%         |    0     |    0     |    0     |    1
>80%         |    1     |    2     |    1     |    1
>70%         |    4     |    5     |    5     |    4

各範囲の合計が日付の下に表示されるようにします。

可能だと思います。

4

1 に答える 1

3

次のステートメントは、FROM 句で結果とテストを結合します。次に、1 日あたりのカウントを使用して、マーク範囲でクエリを集計します。

Select (CASE when mark > 90 then '>90%'
             when mark > 80 then '>80%'
             when mark > 70 then '>70%'
       END) as mark_results,
     sum(case when posted BETWEEN  '2011-07-01 00:00:00' AND  '2011-07-01 23:59:59' then 1 else 0 end) as July01,
     sum(case when posted BETWEEN  '2011-07-02 00:00:00' AND  '2011-07-02 23:59:59' then 1 else 0 end) as July02,
     . . . 
from `results` r join
     test t
     on r.test_id = t.test_id
WHERE r.window_id = 2 and results.mark > 90
group by (CASE when mark > 90 then '>90%'
               when mark > 80 then '>80%'
               when mark > 70 then '>70%'
          END)
order by 1

SELECT 句に好きな日を追加するだけです。

追加する必要があります。. . すべての日付が必要な場合は、それらを別々の行に配置する必要があります。

Select date(posted) as PostedDate,
      (CASE when mark > 90 then '>90%'
             when mark > 80 then '>80%'
             when mark > 70 then '>70%'
       END) as mark_results,
     count(*) as cnt
     . . . 
from `results` r join
     test t
     on r.test_id = t.test_id
WHERE r.window_id = 2 and results.mark > 90
group by date(posted),
         (CASE when mark > 90 then '>90%'
               when mark > 80 then '>80%'
               when mark > 70 then '>70%'
          END)
order by 1, 2

実際、日付ごとに個別の行を作成し、範囲を列としてピボットすることを検討することもできます。

于 2012-07-27T21:19:30.760 に答える