在SQL中对同一个字段不同值,进行数据统计操作
应用场景:需要根据印章的不同状态,统计不同状态下印章数量。
刚开始百度,确实写搜到了不同的答案,但只能怪自己对sql语法解读不够,还是没写出来,导致写出了下面错误的写法。
selectb.corporateOrgName,b.corporateOrgGuidcompanyId, count(casewhenbc.ftypenotin(1,2)then1else0end)total, count(casewhenbc.ftypein(3,4,5)then1else0end)usetotal, count(casewhenbc.ftype=6then1else0end)saveTotal, count(casewhenbc.ftype=7then1else0end)returnTotal fromB_seal_cyclebc joinB_sealb onbc.sealId=b.id whereb.corporateOrgNamelike'%%' groupbyb.corporateOrgName,b.corporateOrgGuid
逻辑上通了,可就是怎么都得不到理想的接口,这样写统计的每一个数据都一样呀。改变之后的正确写法
selectb.corporateOrgName,b.corporateOrgGuidcompanyId, count(casewhenbc.ftypenotin(1,2)then1end)total, count(casewhenbc.ftypein(3,4,5)then1end)usetotal, count(casewhenbc.ftype=6then1end)saveTotal, count(casewhenbc.ftype=7then1end)returnTotal fromB_seal_cyclebc joinB_sealb onbc.sealId=b.id whereb.corporateOrgNamelike'%%' groupbyb.corporateOrgName,b.corporateOrgGuid
你看出不同之处了嘛?把else0去掉就得到了正确的结果。
遇到的问题
1、对casewhen语法,解读有误。
加了else之后,总会对结果取1或0.
2、count函数都会对不管1或0进行统计。
3、当加了else0之后,可以通过sum函数进行统计。
也可以这样写
selectb.corporateOrgName,b.corporateOrgGuidcompanyId, sum(casewhenbc.ftypenotin(1,2)then1else0end)total, sum(casewhenbc.ftypein(3,4,5)then1else0end)usetotal, sum(casewhenbc.ftype=6then1else0end)saveTotal, sum(casewhenbc.ftype=7then1else0end)returnTotal fromB_seal_cyclebc joinB_sealb onbc.sealId=b.id whereb.corporateOrgNamelike'%%' groupbyb.corporateOrgName,b.corporateOrgGuid
有问题,或者有更好的写法,感谢留言指出。
补充知识:SQL语言中执行语句DESC与DESCRIBE有什么区别?
DESCRIBETABLE用于列出指定表或视图中的所有列。
DESCRIBEINDEXFORTABLE用于列出指定表的所有索引,
所以DESCRIBE是用来显示数据结构信息的;
而desc是descend,是用于查询出结果时候对结果进行排序,是降序排序。
DESCRIBE是SHOWCOLUMNSFROM的缩写。
DESCRIBE提供有关一个表的列信息。col_name可以是一个列名或是一个包含SQL通配符字符“%”和“_”的字符串。没有必要用引号包围字符串。
一、describe命令用于查看特定表的详细设计信息
例如为了查看guestbook表的设计信息,可用:
describeguestbookdescribeol_useruserid
二、可通过”showcomnus”来查看数据库中表的列名
有两种使用方式:
showcolumnsform表名from数据库名
或者:
showcolumnsfrom数据库名.表名
三、用describe命令查询具体列的信息
describeguestbookid就是查询guestbook中id字段的列信息
{DESCRIBE| DESC }tbl_name[col_name|wild]
DESCRIBE是SHOWCOLUMNSFROM的缩写。
DESCRIBE提供有关一个表的列信息。col_name可以是一个列名或是一个包含SQL通配符字符“%”和“_”的字符串。没有必要用引号包围字符串。
mysql> desc ol_userusername\G
四、判断字段是否存在
mysql_connect( 'localhost' , 'root' , 'root' ); mysql_select_db( 'demo' ); $test=mysql_query( 'Describecdb_postsfirst' ); $test=mysql_fetch_array($test);
$test[0]返回的是该字段的名称,比如我要查询first字段,返回的就是first
如果此字段不存在返回的就是NULL,通过这样可以判断一个字段是否存在
以上这篇在SQL中对同一个字段不同值,进行数据统计操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。