[英]How to use COUNT with a GROUP BY on two fields
我正在嘗試編寫一個查詢,其中每個日期都將顯示所有建築物,對於不存在的建築物,將列出零。 下面是示例表和示例數據。
CREATE TABLE IF NOT EXISTS `table1` (
`id` int(6) unsigned NOT NULL,
`buildings` char(3) NOT NULL,
`date` varchar(50) NOT NULL,
`sold` char(1) NOT NULL,
PRIMARY KEY (`id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `table1` (`id`, `buildings`, `date`, `sold`) VALUES
('1', '1', '2019-04-22 07:40:08','X'),
('2', '1', '2019-04-22 07:41:15',''),
('3', '1', '2019-04-22 07:42:10','X'),
('4', '3', '2019-04-22 07:43:50','X'),
('5', '1', '2019-04-22 07:44:27',''),
('6', '2', '2019-05-21 06:43:17','X'),
('7', '2', '2019-05-21 07:36:17',''),
('8', '1', '2019-05-21 06:32:22','X'),
('9', '3', '2019-05-21 07:43:50',''),
('10', '2', '2019-05-21 07:44:27','X');
下面列出了我目前使用的SQL查詢。 用於構建第一列的CONCAT和MID正在獲取一年中的年和周,以每周創建一個4位代碼。
SELECT CONCAT(MID(date,3,2),
LPAD(WEEK(CONCAT(MID(date,1,4),'-',
MID(date,6,2),'-',
MID(date,10,2))),2,0)) AS YearWeek,
buildings,
COUNT(sold) AS count
FROM table1
WHERE sold = 'X'
GROUP BY CONCAT(MID(date,3,2),
LPAD(WEEK(CONCAT(MID(date,1,4),'-',
MID(date,6,2),'-',
MID(date,10,2))),2,0)),
buildings
我的問題是我得到如下數據
YearWeek buildings count
1913 1 2
1913 3 1
1917 1 1
1917 2 2
實際上,我希望數據如下所示,以便可以對其進行圖形化處理。
YearWeek buildings count
1913 1 2
1913 2 0
1913 3 1
1917 1 1
1917 2 2
1917 3 0
為了實現這一點,我嘗試對子查詢進行左聯接(從table1中選擇不同的建築物作為建築物),但這沒有用,我認為這是由於我按YearWeek分組,然后構建而不是反過來。
此查詢的任何幫助將不勝感激!
您可以通過獲取不同的YearWeek
和buildings
值的CROSS JOIN
來獲取每種結果的所有可能組合,然后在表中使用LEFT JOIN
來獲取當周售出的每種buildings
的數量,從而獲得所需的結果。 例如:
SELECT yw.YearWeek,
b.buildings,
COALESCE(SUM(t.sold = 'X'), 0) AS count
FROM (SELECT DISTINCT buildings
FROM table1) b
CROSS JOIN (SELECT DISTINCT RIGHT(YEARWEEK(date),4) AS YearWeek
FROM table1) yw
LEFT JOIN table1 t ON t.buildings = b.buildings AND RIGHT(YEARWEEK(t.date),4) = yw.YearWeek
GROUP BY yw.YearWeek, b.buildings
輸出:
YearWeek buildings count
1916 1 2
1916 2 0
1916 3 1
1920 1 1
1920 2 2
1920 3 0
注意我已經使用了MySQL的內置YEARWEEK
函數來簡化查詢,如果不合適,可以簡單地用公式替換。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.