mySql关于统计数量的SQL查询操作
我就废话不多说了,大家还是直接看代码吧~
selectproject_no, sum(casewhendevice_state=0then1else0end)asoffTotal, sum(casewhendevice_state=1then1else0end)asonlineTotal, sum(1)total fromiot_d_device groupbyproject_no orderbyproject_no
补充:MySQL一条SQL语句查询多条统计结果
商城项目难免会遇到用户个人中心页查询不同状态订单数量的问题。当然这个问题并不难,可以写一个DAO层方法,以状态作为入参,每次传入不同状态值依次查询相应状态的订单数量。
今天在写H5端接口时,我想换种方式查,也就是通过一条SQL查询出多个状态的订单数量。在网上搜了搜,方法可行,所以就尝试了下,果不其然成功了。
示例如下(数据只为演示今天的问题,表设计并不严谨。勿怪):
SETFOREIGN_KEY_CHECKS=0; ------------------------------ --Tablestructureformini_test_order ------------------------------ DROPTABLEIFEXISTS`mini_test_order`; CREATETABLE`mini_test_order`( `id`int(11)NOTNULL, `order_no`varchar(32)DEFAULTNULLCOMMENT'订单号', `user_id`int(11)DEFAULTNULLCOMMENT'用户id', `shop_id`int(11)DEFAULTNULLCOMMENT'商家id', `order_status`tinyint(1)DEFAULTNULLCOMMENT'订单状态', `create_time`int(10)DEFAULTNULLCOMMENT'创建时间', PRIMARYKEY(`id`) )ENGINE=InnoDBDEFAULTCHARSET=utf8; ------------------------------ --Recordsofmini_test_order ------------------------------ INSERTINTO`mini_test_order`VALUES('1','aaaaaaaaa','11','111','1','1573041313'); INSERTINTO`mini_test_order`VALUES('2','bbbbbbbb','11','222','1','1573041313'); INSERTINTO`mini_test_order`VALUES('3','cccccccccc','11','333','2','1573041313'); INSERTINTO`mini_test_order`VALUES('4','dddddddd','11','222','3','1573041313'); INSERTINTO`mini_test_order`VALUES('5','eeeeeeeee','11','111','4','1573041313'); INSERTINTO`mini_test_order`VALUES('6','ffffffffffffff','11','111','3','1573041313'); INSERTINTO`mini_test_order`VALUES('7','gggggggg','11','222','4','1573041313'); INSERTINTO`mini_test_order`VALUES('8','hhhhhhhhh','11','111','4','1573041313'); INSERTINTO`mini_test_order`VALUES('9','iiiiiiiiiiiiiiiiiii','11','333','3','1573041313'); INSERTINTO`mini_test_order`VALUES('10','jjjjjjjjjjjjjjjjjj','11','222','1','1573041313');
核心SQL语句如下:
SELECTCOUNT(CASEorder_statusWHEN1THEN1END)AS"状态1",COUNT(CASEorder_statusWHEN2THEN1END)AS"状态2",COUNT(CASEorder_statusWHEN3THEN1END)AS"状态3",COUNT(CASEorder_statusWHEN4THEN1END)AS"状态4"FROM`mini_test_order`;
或如下:
SELECTCOUNT(CASEWHENorder_status=1THEN1END)AS"状态1",COUNT(CASEWHENorder_status=2THEN1END)AS"状态2",COUNT(CASEWHENorder_status=3THEN1END)AS"状态3",COUNT(CASEWHENorder_status=4THEN1END)AS"状态4"FROM`mini_test_order`;
当然,SQL语句不仅仅局限于上述两种写法,喜欢探究的童靴欢迎留言补充。
MySQL的casewhen的语法有两种
1.简单函数
CASE[col_name]WHEN[value1]THEN[result1]…ELSE[default]END
2.搜索函数
CASEWHEN[expr]THEN[result1]…ELSE[default]END
两者区别
前者枚举col_name这个字段值为符合条件value1时所有可能的值;
后者可以写判断,并且搜索函数只会返回第一个符合条件的值,其他case被忽略。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持毛票票。如有错误或未考虑完全的地方,望不吝赐教。