使用MySQL将值分为基本桶和计数

使用MySQL将值分为基本桶和计数,mysql,sql,Mysql,Sql,我在下面提到了三个表格 表1: ID Ref_ID category_id Date II-1 xrt-11-gt 1 2019-01-01 15:34:18 II-2 xtt-10-xt 1 2019-01-05 17:14:20 II-3 xyt-09-yu 2 2019-02-04 11:04:12 I

我在下面提到了三个表格

表1:

ID         Ref_ID          category_id    Date
II-1       xrt-11-gt       1              2019-01-01 15:34:18
II-2       xtt-10-xt       1              2019-01-05 17:14:20
II-3       xyt-09-yu       2              2019-02-04 11:04:12
II-4       xet-12-ct       2              2019-02-01 12:33:14
表2

Ref_ID2       Value
xrt-11-gt     150
xrt-11-gt     175
xrt-11-gt     165
xrt-11-gt     168
xtt-10-xt     200
xtt-10-xt     45
xyt-09-yu     34
xet-12-ct     78
表3

ref        type
1          Active
2          InActive
3          Hold
我有一个问题,比如

select a.ID,a.Date,b.Value,c.type from Table1 a
left join Table2 b on a.Ref_ID=b.Ref_ID2
left join Table3 c on a.category_id=c.ref;
返回我下面提到的输出

ID      Value      Type         Date
II-1    150        Active       2019-01-01 15:34:18
II-1    175        Active       2019-01-01 15:34:18
II-1    165        Active       2019-01-01 15:34:18
II-1    168        Active       2019-01-01 15:34:18
II-2    200        InActive     2019-01-05 17:14:20
II-2    45         InActive     2019-01-05 17:14:20
II-3    34         InActive     2019-02-04 11:04:12
II-4    78         InActive     2019-02-01 12:33:14
我需要在MySQL中以下面提到的格式转换上述输出

其中,
1-3
3-5
是根据
类型
落下的桶上ID基础计数的分岔

Month       Total      Active  1-3   3-5   InActive   1-3   3-5  Hold  1-3  3-5
Jan-19       6           2      1     1       0         0    0     0    0    0
Feb-19       2           0      0     0       2         2    0     0    0    0

这就是你想要的吗:

SELECT
    DATE_FORMAT(date, '%b-%y') month,
    COUNT(*) total,
    SUM(type = 'Active') active,
    CASE WHEN SUM(type = 'Active') BETWEEN 1 AND 3 THEN SUM(type = 'Active') ELSE 0 END `1-3`,
    CASE WHEN SUM(type = 'Active') BETWEEN 4 AND 5 THEN SUM(type = 'Active') ELSE 0 END `4-5`,
    SUM(type = 'InActive') inactive,
    CASE WHEN SUM(type = 'InActive') BETWEEN 1 AND 3 THEN SUM(type = 'InActive') ELSE 0 END `1-3`,
    CASE WHEN SUM(type = 'InActive') BETWEEN 4 AND 5 THEN SUM(type = 'InActive') ELSE 0 END `4-5`,
    SUM(type = 'Hold') hold,
    CASE WHEN SUM(type = 'Hold') BETWEEN 1 AND 3 THEN SUM(type = 'Hold') ELSE 0 END `1-3`,
    CASE WHEN SUM(type = 'Hold') BETWEEN 4 AND 5 THEN SUM(type = 'Hold') ELSE 0 END `4-5`
FROM 
    Table1 a
    LEFT JOIN Table2 b on a.Ref_ID=b.Ref_ID2
    LEFT JOIN Table3 c on a.category_id=c.ref
GROUP BY DATE_FORMAT(date, '%b-%y');

请注意,这不会准确返回您在预期输出中显示的内容。特别是,第一个记录中会有一些差异,即显示1月份的汇总数据:该月的总数将为6,其中4个为活动数据。但这正是我从您的需求中了解到的。

这就是您想要的:

SELECT
    DATE_FORMAT(date, '%b-%y') month,
    COUNT(*) total,
    SUM(type = 'Active') active,
    CASE WHEN SUM(type = 'Active') BETWEEN 1 AND 3 THEN SUM(type = 'Active') ELSE 0 END `1-3`,
    CASE WHEN SUM(type = 'Active') BETWEEN 4 AND 5 THEN SUM(type = 'Active') ELSE 0 END `4-5`,
    SUM(type = 'InActive') inactive,
    CASE WHEN SUM(type = 'InActive') BETWEEN 1 AND 3 THEN SUM(type = 'InActive') ELSE 0 END `1-3`,
    CASE WHEN SUM(type = 'InActive') BETWEEN 4 AND 5 THEN SUM(type = 'InActive') ELSE 0 END `4-5`,
    SUM(type = 'Hold') hold,
    CASE WHEN SUM(type = 'Hold') BETWEEN 1 AND 3 THEN SUM(type = 'Hold') ELSE 0 END `1-3`,
    CASE WHEN SUM(type = 'Hold') BETWEEN 4 AND 5 THEN SUM(type = 'Hold') ELSE 0 END `4-5`
FROM 
    Table1 a
    LEFT JOIN Table2 b on a.Ref_ID=b.Ref_ID2
    LEFT JOIN Table3 c on a.category_id=c.ref
GROUP BY DATE_FORMAT(date, '%b-%y');

请注意,这不会准确返回您在预期输出中显示的内容。特别是,第一个记录中会有一些差异,即显示1月份的汇总数据:该月的总数将为6,其中4个为活动数据。但这是我从您的要求中了解到的。

好的,我是第一个问第1-3列和第3-5列是什么,以及您是如何得到这些数字的?或者很简单,列之间的区别是什么?@nbk:这将基于计数来推导,假设有3个特定id的计数,那么它将落在
1-3
中,如果有4个id,它将落在
3-5
桶中。@VectorJX
1-3
3-5
列从何而来?或者为什么列
1-3
3-5
没有说<代码>1-8和
9-40
?好的,我是第一个问第1-3列和第3-5列是什么,你是如何得到数字的?或者很简单,列之间的区别是什么?@nbk:这将基于计数来推导,假设有3个特定id的计数,那么它将落在
1-3
中,如果有4个id,它将落在
3-5
桶中。@VectorJX
1-3
3-5
列从何而来?或者为什么列
1-3
3-5
没有说<代码>1-8和
9-40
?感谢@nbk修复打字错误!谢谢您的帮助,但是在同一个查询中连接所有三个表并不能很好地工作。桶
1-3
3-5
返回值为0。另外,查询的执行时间太长了。感谢@nbk修复错误!谢谢您的帮助,但是在同一个查询中连接所有三个表并不能很好地工作。桶
1-3
3-5
返回值为0。此外,查询执行时间过长。