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