mysql sum()按條件求和、count()按條件計數


1.情景展示

在實際開發過程中,往往會有根據不同條件進行分組求和的需求,在mysql中如何實現?

表SC_PERSON_INFO有HEALTH_CODE字段,該字段有不同的值,對應不同的含義,現在需要根據每種狀態分別對其進行計數統計,如何實現?

2.sum()按條件求和

語法1:常見用法

SUM(IF(EXPR, column, 0))

表示的含義是:如果滿足表達式expr,+column字段在對應列的值;否則,+0。

語法2:延伸用法

SUM(IF(EXPR, 1, 0))

表示的含義是:如果滿足表達式expr,+1;否則,+0(也就是不加);

多個表達式之間可以"or"、"||"表示“或”,具體含義是:多個條件滿足其中一個即可。

SELECT
  T2.ORGCODE,
  SUM(IF(T2.HEALTH_CODE = 1 || T2.HEALTH_CODE IS NULL, 1, 0)) LVMA,
  SUM(IF(T2.HEALTH_CODE = 2, 1, 0)) HUANGMA,
  SUM(IF(T2.HEALTH_CODE = 3, 1, 0)) HONGMA
FROM
  BASE_ORG_INFO T1,
  SC_PERSON_INFO T2
WHERE T1.ORGCODE = T2.ORGCODE
GROUP BY T2.ORGCODE;

執行結果如下:

3.count()按條件計數

我們可以看到:用sum(if())也能實現按條件計數的功能;

那用count()可以實現嗎?

這里先回憶一下:count(*),count(1)和count(column)的區別。

它們三個的共同點在於:都能實現對表的行數進行計數統計;

在只對某一列數進行統計時,並且,如果該列的某些行的數據為NULL時,區別在於:

count(*)和count(1)會將其統計在內(空行也是行);

count(column)不會將空行統計在內(只對有值的行進行計數)。

所以,利用count()函數的這個特性,我們就能實現:按條件進行計數啦。

語法:

COUNT(IF(EXPR, 1, NULL))

代表的含義是:如果滿足表達式,該行此列的值就為1,最后進行count計數的時候+1;否則,該行此列的值將被設置成null,由於count的特性,所以,在最后計數的時候,將不會對其進行計數。

注意:這里的1是虛擬的,你可以將其設置成任意值,對於count()函數而言,它僅僅代表這是一個有效的計數而已。

SELECT
  t2.ORGCODE,
  COUNT(IF(t2.HEALTH_CODE = 1 || t2.HEALTH_CODE IS NULL, 1, NULL)) lvma,
  COUNT(IF(t2.HEALTH_CODE = 2, 1, NULL)) huangma,
  COUNT(IF(t2.HEALTH_CODE = 3, 1, NULL)) hongma
FROM
  base_org_info t1,
  sc_person_info t2
WHERE t1.ORGCODE = t2.ORGCODE
GROUP BY t2.ORGCODE;

與sum(if())實現的計數效果,一模一樣。

另外,分組查詢,當查詢的列不是聚合函數列或分組列,而我們又想要將其展示出來時,要求:這些列的值必須相同(distinct=1,有且只有唯一值)。

4.Oracle按條件計數

2022年3月7日19:48:56

在Oracle當中,使用sum()按條件求和與count()按條件計數的用法一模一樣,都能實現;

唯一的區別在於:

將if條件改成decode()

SELECT sum(DECODE(B.HYPERTENSION_RISK, '1', 1, 0)) DW
  FROM HEALTH_ASSESSMENT_BP B
 GROUP BY B.HYPERTENSION_RISK
UNION ALL
SELECT count(DECODE(B.HYPERTENSION_RISK, '1', 1, null)) DW
  FROM HEALTH_ASSESSMENT_BP B
 GROUP BY B.HYPERTENSION_RISK

 

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM