簡體   English   中英

如何在兩個字段上將COUNT與GROUP BY一起使用

[英]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分組,然后構建而不是反過來。

此查詢的任何幫助將不勝感激!

您可以通過獲取不同的YearWeekbuildings值的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

dbfiddle上的演示

注意我已經使用了MySQL的內置YEARWEEK函數來簡化查詢,如果不合適,可以簡單地用公式替換。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM