首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

SQL 多表關聯按季度統計各區縣街道戶型出租數量

     編輯:程式設計綜合問答

表結構梳理

  • user(uid PK, uname) —— 客戶信息
  • district(did PK, dname) —— 區縣信息
  • street(sid PK, sname, did FK) —— 街道信息
  • type(tid PK, tname) —— 房屋戶型
  • house(hid PK, uid FK, sid FK, tid FK, price, time) —— 出租房屋

目標

按季度統計本年各區縣、各街道、各戶型的出租房屋數量,輸出格式類似:

區縣 | 街道 | 戶型 | Q1 | Q2 | Q3 | Q4 | 年合計

核心 SQL(MySQL/Oracle/PostgreSQL 通用語法)

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;

關鍵點解析

  1. 多表關聯:house → street → district 獲取區縣、街道名稱;house → type 獲取戶型名稱。
  2. 季度提取:使用 QUARTER(date) 函數(MySQL/PostgreSQL),Oracle 用 TO_CHAR(date, 'Q'),SQL Server 用 DATEPART(QUARTER, date)。
  3. 條件聚合:SUM(CASE WHEN ... THEN 1 ELSE 0 END) 實現行轉列,將季度拆分為多列。
  4. 年份過濾:YEAR(h.time) = YEAR(CURDATE()) 限定本年數據,避免跨年干擾。

擴展:若需包含無數據的區縣/街道/戶型

使用 LEFT JOIN 並將過濾條件移至 ON 子句,或先生成維度笛卡兒積再左連事實表。

性能建議

  • 在 house.time、house.sid、house.tid 上建立聯合索引。
  • 大數據量時考慮分區表或預聚合物化視圖。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved