【问题标题】:How to group by multiple rows and column如何按多行多列分组
【发布时间】:2019-12-31 08:07:04
【问题描述】:
  1. 每个用户有 3 个代码 (10,20,30)
  2. 如果所有代码(10,20,30)都为真,则必须加入
  3. 如果任何代码 (10,20,30) 为 False,则必须忽略
  4. 我们必须检查最大值(日期)

表格如下:

+-------+------+-------+------------+
| user  | code | bool  |    date    |
+-------+------+-------+------------+
| user1 |  10  | True  | 31/10/2019 |
| user1 |  20  | True  | 31/10/2019 |
| user1 |  30  | False | 31/10/2019 |
| user2 |  10  | True  | 31/10/2019 |
| user2 |  20  | True  | 31/10/2019 |
| user2 |  30  | True  | 31/10/2019 |
| user3 |  10  | True  | 31/10/2019 |
| user3 |  20  | True  | 31/10/2019 |
| user3 |  30  | True  | 31/10/2019 |
+-------+------+-------+------------+

输出 user2 和 user3 已加入,user1 已被忽略

+------------+--------+-----------+
|    DATE    | JOINED | NEGLECTED |
+------------+--------+-----------+
| 31/10/2019 |    2   |    1      |
+------------+--------+-----------+

【问题讨论】:

  • user3 为 false,true,true 那么这是如何加入的?
  • @P.Salmon,我的错,改变了

标签: mysql sql select


【解决方案1】:

我假设列bool 的数据类型为BOOL,因此您可以在2 个聚合级别中进行:

select t.date,
  sum(total = 3) joined,
  sum(total <> 3) neglected
from (
  select date, user, sum(bool) total
  from tablename
  group by date, user
) t
group by t.date

请参阅demo
结果:

| date       | joined | neglected |
| ---------- | ------ | --------- |
| 31/10/2019 | 2      | 1         |

如果列的bool 数据类型为VARCHAR,则更改:

sum(bool) total

到:

sum(bool = 'True') total

【讨论】:

    【解决方案2】:

    我将从一个查询开始,该查询将用户分组并根据代码计算他们的状态。然后,我会用一个聚合查询来包装这个查询,以计算每天加入或忽略的用户数:

    SELECT   `date`,
             SUM(`status` = 'joined') AS joined,
             SUM(`status` = 'neglected') AS neglected
    FROM     (SELECT   `user`,
                       `date`,
                       CASE BIT_AND(bool) WHEN TRUE THEN 'joined' ELSE 'neglected' END AS status
              FROM     `mytable`
              GROUP BY `user`, `date`) t
    GROUP BY `date`
    

    【讨论】:

    • BITWISE_AND 不是 mysql 函数。
    • @P.Salmon arg,我的意思是 bit_and - 已编辑和修复。感谢您的关注!
    猜你喜欢
    • 2012-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多