按季度統計本年各區縣、各街道、各戶型的出租房屋數量,輸出格式類似:
區縣 | 街道 | 戶型 | Q1 | Q2 | Q3 | Q4 | 年合計
SELECT
d.dname AS district,
s.sname AS street,
t.tname AS house_type,
SUM(CASE WHEN QUARTER(h.time) = 1 THEN 1 ELSE 0 END) AS Q1,
SUM(CASE WHEN QUARTER(h.time) = 2 THEN 1 ELSE 0 END) AS Q2,
SUM(CASE WHEN QUARTER(h.time) = 3 THEN 1 ELSE 0 END) AS Q3,
SUM(CASE WHEN QUARTER(h.time) = 4 THEN 1 ELSE 0 END) AS Q4,
COUNT(*) AS total_year
FROM house h
JOIN street s ON h.sid = s.sid
JOIN district d ON s.did = d.did
JOIN type t ON h.tid = t.tid
WHERE YEAR(h.time) = YEAR(CURDATE()) -- 本年數據
GROUP BY d.dname, s.sname, t.tname
ORDER BY d.dname, s.sname, t.tname;
QUARTER(date) 函數(MySQL/PostgreSQL),Oracle 用 TO_CHAR(date, 'Q'),SQL Server 用 DATEPART(QUARTER, date)。SUM(CASE WHEN ... THEN 1 ELSE 0 END) 實現行轉列,將季度拆分為多列。YEAR(h.time) = YEAR(CURDATE()) 限定本年數據,避免跨年干擾。使用 LEFT JOIN 並將過濾條件移至 ON 子句,或先生成維度笛卡兒積再左連事實表。
house.time、house.sid、house.tid 上建立聯合索引。