【问题标题】:Using a MySQL case condition to create a column in a query that uses count and group by使用 MySQL 案例条件在使用 count 和 group by 的查询中创建列
【发布时间】:2018-01-24 15:38:42
【问题描述】:

我有一个如下所示的数据架构:

"id"|"utest_id"|"member_id"|"utest_step_id"|"value"
699 |21        |162        |522            |4
704 |21        |163        |522            |2
709 |21        |164        |522            |2
714 |21        |165        |522            |2
719 |21        |166        |522            |3
724 |21        |167        |522            |5
729 |21        |168        |522            |4
734 |21        |169        |522            |2
739 |21        |170        |522            |1
744 |21        |171        |522            |5
749 |21        |172        |522            |3
754 |21        |173        |522            |3
759 |21        |174        |522            |4
764 |21        |175        |522            |3
769 |21        |176        |522            |5
774 |21        |177        |522            |4
779 |21        |178        |522            |1
784 |21        |179        |522            |4
789 |21        |180        |522            |3
794 |21        |181        |522            |2
799 |21        |182        |522            |3
804 |21        |183        |522            |1                

我有一个 MySQL 查询,它按值分组并返回每个值的计数。

SELECT URPS.value, count(URPS.value) AS count,
(CASE WHEN URPS.member_id = '183' THEN 'true' END) as MemberAnswer
FROM utest_results_per_step URPS
WHERE URPS.utest_step_id = '522' 
GROUP BY URPS.value;

这给了我正确的分组和计数。

value | count | MemberAnswer
1       21      NULL
2       20      NULL
3       26      NULL
4       21      NULL
5       12      NULL

我在查询中有一个 CASE 条件,它创建了一个名为 MemberAnswer 的列,如果对于给定的比较,member_id 值是 true,我希望它在该值的行的该列中有一个“true”条目。但是,我只会得到 NULL。

这是否可以在单个查询中实现,如果可以,我将如何重组我的查询以返回它?

【问题讨论】:

    标签: mysql group-by count case


    【解决方案1】:

    您需要将CASE 表达式包装在一个聚合函数中,并使用另一个CASE 来检查聚合返回的结果。

    所以而不是:

    (CASE WHEN URPS.member_id = '183' THEN 'true' END) as MemberAnswer
    

    你应该使用:

    CASE 
       WHEN COUNT(CASE WHEN URPS.member_id = '183' THEN 1 END) > 0 THEN 'true'
       ELSE 'false'
    END AS MemberAnswer
    

    所以您的查询将是:

    SELECT URPS.value, 
           count(URPS.value) AS count,
           CASE 
              WHEN COUNT(CASE WHEN URPS.member_id = '183' THEN 1 END) > 0 THEN 'true'
              ELSE 'false'
           END AS MemberAnswer
    FROM utest_results_per_step URPS
    WHERE URPS.utest_step_id = '522' 
    GROUP BY URPS.value;
    

    输出:

    value count MemberAnswer
    ------------------------
    1     3     true
    2     5     false
    3     6     false
    4     5     false
    5     3     false
    

    Demo here

    【讨论】:

    • 完美!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2016-09-06
    • 2015-11-10
    • 1970-01-01
    • 2017-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多