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

SQL 多表關聯查詢:統計訂單總金額(工時費+材料成本)超過 100 元的訂單筆數

     編輯:程式設計綜合問答

資料表結構

  • A 表(訂單表):id、Workfee(工時費)
  • B 表(訂單產品表):id、Aid(外鍵關聯 A.id)、chanpinid(產品 ID)、shuliang(數量)
  • C 表(倉庫/價格表):id、danjia(單價)

需求:查詢 A.Workfee + Σ(B.shuliang * C.danjia) > 100 的訂單數量。

標準 SQL 寫法(以 SQL Server / MySQL 為例)

SELECT COUNT(DISTINCT a.id) AS order_count
FROM Table_A a
JOIN (
    SELECT b.Aid, SUM(c.danjia * b.shuliang) AS material_cost
    FROM Table_B b
    JOIN Table_C c ON b.chanpinid = c.id
    GROUP BY b.Aid
) d ON a.id = d.Aid
WHERE a.Workfee + d.material_cost > 100;

關鍵點解析

  1. 先聚合材料成本:子查詢先按 Aid 分組,計算每張訂單的材料總成本 SUM(C.danjia * B.shuliang)。
  2. 再關聯主表:將聚合結果與 A 表關聯,得到工時費 Workfee。
  3. 最後過濾:在外層 WHERE 中判斷 Workfee + material_cost > 100,並用 COUNT(DISTINCT a.id) 統計符合條件的訂單筆數。

題主原 SQL 的問題

  • 使用 GROUP BY Ai.d 拼寫錯誤,應為 GROUP BY a.id。
  • HAVING SUM(C.danjia*B.shuliang+A.workfee) 會重複加總工時費(每筆明細都加一次),導致結果偏大。
  • 缺少明確的 JOIN ... ON 語法,舊式逗號關聯易產生笛卡兒積。

測試資料驗證

文中提供的建表與插入腳本可直接跑通,驗證邏輯正確性。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved