MySQL 按多个日期和结果分组总计

标签 mysql sql database

我有一个结果表,其中列出了一组值,每个值都链接到另一个包含结果生成日期的表。

我有有效的 SQL 来获取所有日期(使用 CASE),但是我只能检索单个结果范围。

    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 查询,它可以获取所有范围,但一次只能用于一个日期。

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;

我想要的是将所有内容都包含在一个统一查询中,显示每个结果范围的相关总计。比如下面这样:

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

以便每个范围的总计显示在其日期下方。

我认为这是可能的。

最佳答案

以下语句将结果和测试连接到 FROM 子句中。然后,它按标记范围聚合查询以及每天的计数:

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

事实上,您可能会考虑为每个日期设置一个单独的行,并将范围作为列进行透视。

关于MySQL 按多个日期和结果分组总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11694988/

相关文章:

MySQL 到 Redis - 导入和建模

mysql - 星期几的数字表示 MySql 与 PHP

database - 如何使用 aerospike 加载程序在 aerospike 中加载嵌套的 csv 文件?

asp.net - 在不同的项目中创建数据库上下文

java - Realm 在一个线程中保存数据在另一个线程中获取

mysql - 多次加入同一张 table

PHP/MySQL - 同时进行多个查询

php - 如果字段不存在,则SQL插入行

MySQL 显示其他列中每个不同值的最新日期的行?

php - 使用数据库中的自定义字段创建 WP 自定义帖子类型