我有這三個表,每個合約可以系結多個單元。我需要的是同一合同中所有單位的欄位“面積”之和。

查詢應如下所示。最后一個欄位“價格分數”將是一個計算欄位,所以我在 SQL 查詢中不需要它。

我試過撰寫查詢,但它總是給出錯誤的總和。
Select
Unit.description "Unit",
Unit.area "Area",
Contract.price "Contract Value",
(select sum(Unit.area) from Unit, ContractUnit where ContractUnit.unit_id = Unit.id) "area_sum"
from
Unit
JOIN ContractUnit ON ContractUnit.id_unit = Unit.id
JOIN Contract ON Contract.id = ContractUnit.contract_id
where Unit.id = :idUnit
uj5u.com熱心網友回復:
讓我們剖析需求并將其分解為多個步驟。
評價:
共有三個表:
單元
合同
合同單位
Unit和Contract物體具有多對多關系,因此需要ContractUnit,它是關聯物體(或橋表)。
第 1 步:首先需要列出以下列: Unit_id 、 Area (來自表Unit)
Contract_value(dollars) 和 contract_id (來自表contract )
實際上,最終輸出不需要contract_id,但在第一步中仍然需要它,因為 sum_area 是在它上面計算的。在最終輸出中,我們不會顯示它。
所以我們在這里得到它:
SELECT u.id unit,
u.area area,
c.price contract_value,
c.id contract_id
FROM unit u
INNER JOIN contractunit cu
ON u.id = cu.unit_id
INNER JOIN contract c
ON c.id = cu.contract_id
輸出:
unit | area | contract_value | contract_id
------ ------ ---------------- -------------
1 | 340 | 400000 | 1
2 | 540 | 400000 | 1
3 | 130 | 560000 | 2
4 | 503 | 560000 | 2
(4 rows)
第 2 步:我們通過在上面獲得的輸出上對 contract_id 進行面積總和來獲得最終值。
SELECT unit,
area,
subq.contract_value,
Sum(area)
OVER (
partition BY contract_id) sum_area
FROM (<earlier query> ) subq;
那是:
SELECT unit,
area,
subq.contract_value,
Sum(area)
OVER (
partition BY contract_id) sum_area
FROM (SELECT u.id unit,
u.area area,
c.price contract_value,
c.id contract_id
FROM unit u
INNER JOIN contractunit cu
ON u.id = cu.unit_id
INNER JOIN contract c
ON c.id = cu.contract_id ) subq;
結果:
unit | area | contract_value | sum_area
------ ------ ---------------- ----------
1 | 340 | 400000 | 880
2 | 540 | 400000 | 880
3 | 130 | 560000 | 633
4 | 503 | 560000 | 633
(4 rows)
--- 如果您的 RDBMS 型別/版本不支持視窗函式甚至 CTE ,您可以使用此查詢獲得相同的結果 ---
SELECT b.unit,
b.area,
b.contract_value,
a.sum_area
FROM (SELECT contract_id,
Sum(area) sum_area
FROM (SELECT u.id unit,
u.area area,
c.price contract_value,
c.id contract_id
FROM unit u
INNER JOIN contractunit cu
ON u.id = cu.unit_id
INNER JOIN contract c
ON c.id = cu.contract_id) subq
GROUP BY contract_id) a
INNER JOIN (SELECT u.id unit,
u.area area,
c.price contract_value,
c.id contract_id
FROM unit u
INNER JOIN contractunit cu
ON u.id = cu.unit_id
INNER JOIN contract c
ON c.id = cu.contract_id) b
ON a.contract_id = b.contract_id;
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/428226.html
上一篇:重組何時發生?改變狀態或改變輸入
下一篇:我想訪問總金額的產品
