在SQL中對(duì)同一個(gè)字段不同值,進(jìn)行數(shù)據(jù)統(tǒng)計(jì)操作
應(yīng)用場(chǎng)景: 需要根據(jù)印章的不同狀態(tài),統(tǒng)計(jì)不同狀態(tài)下印章數(shù)量。
剛開(kāi)始百度,確實(shí)寫搜到了不同的答案,但只能怪自己對(duì)sql語(yǔ)法解讀不夠,還是沒(méi)寫出來(lái),導(dǎo)致寫出了下面錯(cuò)誤的寫法。
select b.corporateOrgName, b.corporateOrgGuid companyId, count(case when bc.ftype not in(1,2) then 1 else 0 end ) total, count(case when bc.ftype in(3,4,5) then 1 else 0 end ) usetotal, count(case when bc.ftype = 6 then 1 else 0 end ) saveTotal, count(case when bc.ftype = 7 then 1 else 0 end ) returnTotal from B_seal_cycle bc join B_seal b on bc.sealId = b.id where b.corporateOrgName like '%%' group by b.corporateOrgName,b.corporateOrgGuid
邏輯上通了,可就是怎么都得不到理想的接口,這樣寫統(tǒng)計(jì)的每一個(gè)數(shù)據(jù)都一樣呀。改變之后的正確寫法
select b.corporateOrgName, b.corporateOrgGuid companyId, count(case when bc.ftype not in(1,2) then 1 end ) total, count(case when bc.ftype in(3,4,5) then 1 end ) usetotal, count(case when bc.ftype = 6 then 1 end ) saveTotal, count(case when bc.ftype = 7 then 1 end ) returnTotal from B_seal_cycle bc join B_seal b on bc.sealId = b.id where b.corporateOrgName like '%%' group by b.corporateOrgName,b.corporateOrgGuid
你看出不同之處了嘛? 把else 0 去掉就得到了正確的結(jié)果。
遇到的問(wèn)題
1、 對(duì)case when 語(yǔ)法,解讀有誤。
加了else 之后,總會(huì)對(duì)結(jié)果取 1 或 0.
2、 count函數(shù)都會(huì)對(duì)不管1 或 0 進(jìn)行統(tǒng)計(jì)。
3、 當(dāng)加了else 0 之后,可以通過(guò)sum函數(shù)進(jìn)行統(tǒng)計(jì)。
也可以這樣寫
select b.corporateOrgName, b.corporateOrgGuid companyId, sum(case when bc.ftype not in(1,2) then 1 else 0 end ) total, sum(case when bc.ftype in(3,4,5) then 1 else 0 end ) usetotal, sum(case when bc.ftype = 6 then 1 else 0 end ) saveTotal, sum(case when bc.ftype = 7 then 1 else 0 end ) returnTotal from B_seal_cycle bc join B_seal b on bc.sealId = b.id where b.corporateOrgName like '%%' group by b.corporateOrgName,b.corporateOrgGuid
有問(wèn)題,或者有更好的寫法,感謝留言指出。
補(bǔ)充知識(shí):SQL語(yǔ)言中 執(zhí)行語(yǔ)句 DESC與DESCRIBE有什么區(qū)別?
DESCRIBE TABLE 用于列出指定表或視圖中的所有列。
DESCRIBE INDEX FOR TABLE 用于列出指定表的所有索引,
所以 DESCRIBE是用來(lái)顯示數(shù)據(jù)結(jié)構(gòu)信息的;
而desc是descend ,是用于查詢出結(jié)果時(shí)候?qū)Y(jié)果進(jìn)行排序,是降序排序。
DESCRIBE 是 SHOW COLUMNS FROM 的縮寫。
DESCRIBE 提供有關(guān)一個(gè)表的列信息。col_name 可以是一個(gè)列名或是一個(gè)包含 SQL 通配符字符 “%” 和 “_” 的字符串。沒(méi)有必要用引號(hào)包圍字符串。
一、describe命令用于查看特定表的詳細(xì)設(shè)計(jì)信息
例如為了查看guestbook表的設(shè)計(jì)信息,可用:
describe guestbook describe ol_user userid
二、可通過(guò)”show comnus”來(lái)查看數(shù)據(jù)庫(kù)中表的列名
有兩種使用方式:
show columns form 表名 from 數(shù)據(jù)庫(kù)名
或者:
show columns from 數(shù)據(jù)庫(kù)名.表名
三、用describe命令查詢具體列的信息
describe guestbook id 就是查詢guestbook中id字段的列信息
{DESCRIBE | DESC } tbl_name [col_name | wild]
DESCRIBE 是 SHOW COLUMNS FROM 的縮寫。
DESCRIBE 提供有關(guān)一個(gè)表的列信息。col_name 可以是一個(gè)列名或是一個(gè)包含 SQL 通配符字符 “%” 和 “_” 的字符串。沒(méi)有必要用引號(hào)包圍字符串。
mysql> desc ol_user username\G
四、判斷字段是否存在
mysql_connect( 'localhost' , 'root' , 'root' ); mysql_select_db( 'demo' ); $test = mysql_query( 'Describe cdb_posts first' ); $test = mysql_fetch_array($test);
$test[0]返回的是該字段的名稱,比如我要查詢first字段,返回的就是first
如果此字段不存在返回的就是NULL,通過(guò)這樣可以判斷一個(gè)字段是否存在
以上這篇在SQL中對(duì)同一個(gè)字段不同值,進(jìn)行數(shù)據(jù)統(tǒng)計(jì)操作就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
MySQL UDF調(diào)試方式debugview的相關(guān)方法
MySQL UDF調(diào)試方式debugview的相關(guān)方法...2007-07-07Windows7下Python3.4使用MySQL數(shù)據(jù)庫(kù)
這篇文章主要為大家詳細(xì)介紹了Windows7下Python3.4使用MySQL數(shù)據(jù)庫(kù),MySQL Community Server的安裝步驟,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-07-07區(qū)別于Oracle的MySQL?insert會(huì)阻塞update
這篇文章主要介紹了區(qū)別于Oracle的MySQL?insert會(huì)阻塞update的問(wèn)題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03mysql中獲取一天、一周、一月時(shí)間數(shù)據(jù)的各種sql語(yǔ)句寫法
今天抽時(shí)間整理了一篇mysql中與天、周、月有關(guān)的時(shí)間數(shù)據(jù)的sql語(yǔ)句的各種寫法,部分是收集資料,全部手工整理,自己學(xué)習(xí)的同時(shí),分享給大家,并首先默認(rèn)創(chuàng)建一個(gè)表、插入2條數(shù)據(jù),便于部分?jǐn)?shù)據(jù)的測(cè)試,其中部分名詞或函數(shù)進(jìn)行了解釋說(shuō)明。直入主題2014-05-05mysql在項(xiàng)目中怎么選事務(wù)隔離級(jí)別
Mysql默認(rèn)的事務(wù)隔離級(jí)別是可重復(fù)讀,那互聯(lián)網(wǎng)項(xiàng)目中Mysql也是用默認(rèn)隔離級(jí)別,但在項(xiàng)目中呢,下面我們就一起來(lái)了解一下2021-05-05