求教mysql 如何多列统计

qq_37585639 2018-03-01 04:47:40

在做个统计数据 有三个字段分别是手机号码 流水号 状态 如果号码 相同 流水号相同 状态相同 就做成功5条 如果其中任何一个字段值不同相同就做失败5条 请教大神
比如 状态 有值不同 那就全部做失败5条
我现在 只会按照状态值 来判断如下sql

不知道 怎么做到三个字段 都相同的情况 去统计
请大神给点思路 被困了一天
...全文
1129 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaovhao 2018-03-30
  • 打赏
  • 举报
回复
引用 4 楼 u014038116 的回复:

SELECT
	sum(CASE WHEN t.num = 5 THEN 5 ELSE 0 END) AS success ,
	sum(CASE WHEN t.num <> 5 THEN 5 ELSE 0 END) AS defeated
FROM
	(
		SELECT
			sum(
				CASE
				WHEN STATUS = 'DELIVERD' THEN
					1
				ELSE
					0
				END
			) AS num
		FROM
			sms_msgid_log_01
		GROUP BY
			dest_teminal_id ,
			msgid1
	) t

先根据号码和流失号分组统计查询,然后再从子查询中查询,为5的就是都成功了,不为5的就是至少有一个失败了
现在才看到,如果不确定,你可以在统计每条短信被拆分成几条的啊

SELECT
    sum(CASE WHEN t.num = t.total THEN t.total ELSE 0 END) AS success ,
    sum(CASE WHEN t.num <> t.total THEN t.total ELSE 0 END) AS defeated
FROM
    (
        SELECT
            sum(
                CASE
                WHEN STATUS = 'DELIVERD' THEN
                    1
                ELSE
                    0
                END
            ) AS num,
	    count(1) as total
        FROM
            sms_msgid_log_01
        GROUP BY
            dest_teminal_id ,
            msgid1
    ) t

smnzg 2018-03-12
  • 打赏
  • 举报
回复
引用 12 楼 qq_37585639 的回复:
[quote=引用 11 楼 smnzg 的回复:] 修改一下 select 手机号码, 流水号, count(1) as 数量, CASE WHEN count(1) - count(status='DELIVERY') =0 THEN 'success' else 'failure' as 状态 from sms_msgid_log_01 group by 手机号码, 流水号
谢谢你 但 count(1) - count(status='DELIVERY') =0没有根据状态的值筛出成功的数据,很郁闷[/quote] 如果count(status='DELIVERY') 这句不能用的话,就要看你mysql的版本了,我试了是可以的 你说的没有筛出成功的数据是什么意思?
qq_37585639 2018-03-12
  • 打赏
  • 举报
回复
引用 11 楼 smnzg 的回复:
修改一下 select 手机号码, 流水号, count(1) as 数量, CASE WHEN count(1) - count(status='DELIVERY') =0 THEN 'success' else 'failure' as 状态 from sms_msgid_log_01 group by 手机号码, 流水号
谢谢你 但 count(1) - count(status='DELIVERY') =0没有根据状态的值筛出成功的数据,很郁闷
qq_37585639 2018-03-08
  • 打赏
  • 举报
回复
引用 3 楼 u011594442 的回复:
[quote=引用 2 楼 qq_37585639 的回复:] 是5行一样就算成功 统计为5条成功 如果一行中一条状态不同算失败 统计为失败5条 (做的是长短信的拆分 意思就是5条成功表示发送成功 如果中间有一条失敗这条短息就是发送失败)
select count(1) from (select dest_terminal_id, msgid1, status from sms_msgid_log_01 group by dest_terminal_id, msgid1, status) 等于1 成功,大于1 失败 试试[/quote] 额 这个sql报错了
qq_37585639 2018-03-08
  • 打赏
  • 举报
回复
引用 3 楼 u011594442 的回复:
[quote=引用 2 楼 qq_37585639 的回复:] 是5行一样就算成功 统计为5条成功 如果一行中一条状态不同算失败 统计为失败5条 (做的是长短信的拆分 意思就是5条成功表示发送成功 如果中间有一条失敗这条短息就是发送失败)
select count(1) from (select dest_terminal_id, msgid1, status from sms_msgid_log_01 group by dest_terminal_id, msgid1, status) 等于1 成功,大于1 失败 试试[/quote] 谢谢 子查询我有试过 但在千万级别的数据情况下 效率实在是太低了
qq_37585639 2018-03-08
  • 打赏
  • 举报
回复
引用 4 楼 u014038116 的回复:

SELECT
	sum(CASE WHEN t.num = 5 THEN 5 ELSE 0 END) AS success ,
	sum(CASE WHEN t.num <> 5 THEN 5 ELSE 0 END) AS defeated
FROM
	(
		SELECT
			sum(
				CASE
				WHEN STATUS = 'DELIVERD' THEN
					1
				ELSE
					0
				END
			) AS num
		FROM
			sms_msgid_log_01
		GROUP BY
			dest_teminal_id ,
			msgid1
	) t

先根据号码和流失号分组统计查询,然后再从子查询中查询,为5的就是都成功了,不为5的就是至少有一个失败了
先谢谢你 但短信拆分的条数不是固定的数量 意思就是 可能是 3条 或 4条 短信是按每68个字为一条拆分的 比如有一条短信是100个字 就拆分为两条 这两条号码 跟流水号肯定是相同的 只有状态可能不相同
smnzg 2018-03-08
  • 打赏
  • 举报
回复
修改一下 select 手机号码, 流水号, count(1) as 数量, CASE WHEN count(1) - count(status='DELIVERY') =0 THEN 'success' else 'failure' as 状态 from sms_msgid_log_01 group by 手机号码, 流水号
smnzg 2018-03-08
  • 打赏
  • 举报
回复
从题主的说明来看,应该是当状态都为Delivery的时候,才是成功,否则为失败 所以sql可以写成 select 手机号码, 流水号, count(1) as 数量, CASE WHEN count(1) - count(status='DELIVERY') ==0 THEN 'success' else 'failure' from sms_msgid_log_01
qq_37585639 2018-03-08
  • 打赏
  • 举报
回复
SELECT count(1) from sms_msgid_log_01 WHERE msgid1 IN (SELECT DISTINCT(msgid1) FROM sms_msgid_log_01 WHERE `status`!='DELIVRD') AND `status`='DELIVRD' 我试过这种来筛选 但是这种方法 在上千万数据中 得好久可能要一个小时甚至更久 这样的效率真心想吐血
引用 7 楼 qq_37585639 的回复:
[quote=引用 3 楼 u011594442 的回复:] [quote=引用 2 楼 qq_37585639 的回复:] 是5行一样就算成功 统计为5条成功 如果一行中一条状态不同算失败 统计为失败5条 (做的是长短信的拆分 意思就是5条成功表示发送成功 如果中间有一条失敗这条短息就是发送失败)
select count(1) from (select dest_terminal_id, msgid1, status from sms_msgid_log_01 group by dest_terminal_id, msgid1, status) 等于1 成功,大于1 失败 试试[/quote] 额 这个sql报错了[/quote]
引用 8 楼 u011594442 的回复:
[quote=引用 7 楼 qq_37585639 的回复:] [quote=引用 3 楼 u011594442 的回复:] [quote=引用 2 楼 qq_37585639 的回复:] 是5行一样就算成功 统计为5条成功 如果一行中一条状态不同算失败 统计为失败5条 (做的是长短信的拆分 意思就是5条成功表示发送成功 如果中间有一条失敗这条短息就是发送失败)
select count(1) from (select dest_terminal_id, msgid1, status from sms_msgid_log_01 group by dest_terminal_id, msgid1, status) 等于1 成功,大于1 失败 试试[/quote] 额 这个sql报错了[/quote] 额。。。大概意思就是group by 这三列,如果全部相同只会出来一条数据。否则就是有不同的~~照这个逻辑你自己再看看吧[/quote] 嗯 谢谢你
Sunyiban 2018-03-08
  • 打赏
  • 举报
回复
引用 7 楼 qq_37585639 的回复:
[quote=引用 3 楼 u011594442 的回复:] [quote=引用 2 楼 qq_37585639 的回复:] 是5行一样就算成功 统计为5条成功 如果一行中一条状态不同算失败 统计为失败5条 (做的是长短信的拆分 意思就是5条成功表示发送成功 如果中间有一条失敗这条短息就是发送失败)
select count(1) from (select dest_terminal_id, msgid1, status from sms_msgid_log_01 group by dest_terminal_id, msgid1, status) 等于1 成功,大于1 失败 试试[/quote] 额 这个sql报错了[/quote] 额。。。大概意思就是group by 这三列,如果全部相同只会出来一条数据。否则就是有不同的~~照这个逻辑你自己再看看吧
qq_37585639 2018-03-05
  • 打赏
  • 举报
回复
是5行一样就算成功 统计为5条成功 如果一行中一条状态不同算失败 统计为失败5条 (做的是长短信的拆分 意思就是5条成功表示发送成功 如果中间有一条失敗这条短息就是发送失败)
xiaovhao 2018-03-05
  • 打赏
  • 举报
回复

SELECT
	sum(CASE WHEN t.num = 5 THEN 5 ELSE 0 END) AS success ,
	sum(CASE WHEN t.num <> 5 THEN 5 ELSE 0 END) AS defeated
FROM
	(
		SELECT
			sum(
				CASE
				WHEN STATUS = 'DELIVERD' THEN
					1
				ELSE
					0
				END
			) AS num
		FROM
			sms_msgid_log_01
		GROUP BY
			dest_teminal_id ,
			msgid1
	) t

先根据号码和流失号分组统计查询,然后再从子查询中查询,为5的就是都成功了,不为5的就是至少有一个失败了
Sunyiban 2018-03-05
  • 打赏
  • 举报
回复
引用 2 楼 qq_37585639 的回复:
是5行一样就算成功 统计为5条成功 如果一行中一条状态不同算失败 统计为失败5条 (做的是长短信的拆分 意思就是5条成功表示发送成功 如果中间有一条失敗这条短息就是发送失败)
select count(1) from (select dest_terminal_id, msgid1, status from sms_msgid_log_01 group by dest_terminal_id, msgid1, status) 等于1 成功,大于1 失败 试试
艾德 2018-03-03
  • 打赏
  • 举报
回复
没看明白,是说有5行一样的就算成功,5行不一样的就算失败?最后要统计成功的个数?

81,091

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧