背景
- 本鹵蛋小白一枚亮钦,刷題時(shí)被大家都說簡單的SQL難住了,題目涉及同時(shí)按條件計(jì)數(shù)和按條件加和
- 最后靠著PureWeber大大的解答解了出來酷麦。本解法還綜合了其他帖子甚负。
- 所以本鹵蛋打算來分享一下這道題,和一種思路窝剖。
題目
上圖是了題干麻掸。簡單概括如下:
你有一個(gè)DVD租賃店的訂單信息數(shù)據(jù)表。關(guān)鍵字段有:
-
staff_id
:員工工號赐纱;1是個(gè)叫Mike的家伙脊奋,2是一個(gè)叫Jon的家伙 -
rental_id
: 此處可以理解為訂單編號 -
amount
: 支付金額?反正是要用于加和東西但算出來又不太像??的東西 -
payment_date
: 成交日期疙描,只有07年一年的數(shù)據(jù)
我們需要按月匯總這家店逐月的單量和總amount情況诚隙,同時(shí)我們也需要搞清楚Mike和Jon分別經(jīng)手了多少訂單,分別有多少amount起胰。因此久又,這就是一個(gè)既要分條件計(jì)數(shù)又要分條件加和的問題。輸出結(jié)果需要的字段如下:
PS. 這個(gè)數(shù)據(jù)庫運(yùn)行在PostgreSQL 9.6下
一種思路
以下提供一種思路
/*
https://www.pureweber.com/article/mysql-conditional-count/
*/
SELECT
EXTRACT(month FROM payment_date) AS month,
COUNT(rental_id) AS total_count,
SUM(amount) AS total_amount,
COUNT(CASE WHEN staff_id=1 THEN 1 ELSE NULL END) AS mike_count,
SUM(CASE WHEN staff_id<>1 THEN NULL ELSE (amount) END) AS mike_amount,
COUNT(CASE WHEN staff_id=2 THEN 1 ELSE NULL END) AS jon_count,
SUM(CASE WHEN staff_id<>2 THEN NULL ELSE (amount) END) AS jon_amount
FROM payment
GROUP BY month
ORDER BY month
- 這里的思路是:整體先按月匯總效五,然后具體列根據(jù)需要使用
CASE...WHEN
靈活處理地消; - 按照PureWeber大大的思(dai)路(ma)解決按條件計(jì)數(shù)不是難事,問題在于如何在不影響原值的情況下按條件加和火俄;
- 這里的方法參考了這個(gè)問答犯建,使用括號帶入應(yīng)有的變量名;(當(dāng)然瓜客,當(dāng)時(shí)本蛋在碼代碼的時(shí)候蠢了适瓦,判斷邏輯明明可以是一樣的~先就這樣吧)
-
這個(gè)問答同時(shí)提醒我們?yōu)槭裁?a target="_blank" rel="nofollow">PureWeber在
COUNT
語句中使用了NULL
,因?yàn)槿绻顬?確實(shí)是會(huì)計(jì)數(shù)的谱仪; -
SELECT
后跟多個(gè)子查詢應(yīng)該也是可行的玻熙,就是麻煩,而且似乎顯得略不優(yōu)雅疯攒,因?yàn)樯婕暗叫枰啻翁崛≡路菪畔⒅孛麀
本鹵蛋在抓狂的時(shí)候還查詢了以下帖子: