iT邦幫忙

1

mysql

  • 分享至 

  • xImage

資料表有id ,加入日期 ,退出日期

id 加入日期 退出日期
1 2017 null
2 2017 null
3 2018 null
4 2019 2022
5 2020 null

想呈現計算加入的人數和退出的人數 ,如下:

加入日期 加入人數 退出人數
2017 2 0
2018 1 0
2019 1 0
2020 1 0
2022 0 1
請問mysql該如何下。
canrong iT邦新手 3 級 ‧ 2022-08-06 10:11:48 檢舉
有點奇怪,依照你以加入日期分群的邏輯來看,那個退出人數1應該放在加入日期2019那。如果想如你想呈現的表來看應該先將所有日期取得(加入與退出的所有,因為退出日期應該大於加入日期)後分別依照加入與退出計數。
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中
5
㊣浩瀚星空㊣
iT邦大神 1 級 ‧ 2022-08-06 11:07:28
最佳解答

我就不多問了。直接給你答案

SELECT a.加入日期,b.num AS 加入人數,c.num AS 退出人數 FROM db AS a
LEFT JOIN (SELECT 加入日期,count(加入日期) AS num FROM db Group By 加入日期) AS b on(a.加入日期=b.加入日期)
LEFT JOIN (SELECT 退出日期,count(退出日期) AS num FROM db Group By 退出日期) AS c on(a.加入日期=c.退出日期)
GROUP BY 加入日期
1
rogeryao
iT邦超人 8 級 ‧ 2022-08-06 15:10:41
CREATE TABLE my_table (
Id varchar(20),
Date_Join varchar(20),
Date_Quit varchar(20));

INSERT INTO my_table (Id,Date_Join,Date_Quit)
VALUES 
('21', '2017', NULL),
('22', '2017', NULL),
('23', '2018', NULL),
('24', '2019', '2022'),
('25', '2020', NULL),
-- 額外加入
('16', '2012', NULL),
('17', '2012', '2012'),
('18', '2013', '2015'),
('19', '2014', '2015');
SELECT X.Date_All AS `加入日期`,SUM(X.Num1) AS `加入人數`,SUM(X.Num2) AS `退出人數`
FROM (
SELECT Date_Join AS 'Date_All',COUNT(Date_Join) AS Num1,0 AS Num2
FROM my_table
GROUP BY Date_Join
UNION
SELECT Date_Quit AS 'Date_All',0 AS Num,COUNT(Date_Quit) AS Num2
FROM my_table
GROUP BY Date_Quit) AS `X`
WHERE X.Date_All IS NOT NULL
GROUP BY X.Date_All

Demo

sibulun iT邦新手 5 級 ‧ 2022-08-06 22:30:13 檢舉

感謝解答 看完樓上跟您的解答 都是先將表拆成加入跟退出 然後再合併 您是用union 樓上是用left join ,學習了

rogeryao iT邦超人 8 級 ‧ 2022-08-09 23:25:03 檢舉

可否貼出程式碼,以提供幫友不同的解法 ?

3
ckp6250
iT邦好手 1 級 ‧ 2022-08-07 05:35:42

這個資料表規劃尚有精進空間,null 的筆數佔掉太多空間。
改成這樣也不錯,
id,類別(1.加入、2.退出),日期

程式碼就可以簡化了。

SELECT
	加入日期,
	sum(IF(類別= 1, 1, 0 ) AS 加入人數,
	sum(IF(類別= 2, 1, 0 ) AS 退出人數 
FROM	xxx 
GROUP BY 加入日期

我要發表回答

立即登入回答