Select第三个查询table
Select Query of third table
我有这三个表,每个合约可以绑定几个单位。
我需要的是同一合同中所有单位的字段“面积”的总和。
查询应如下所示。最后一个字段“价格分数”将是一个计算字段,因此我在 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
让我们剖析需求并将其分解为步骤。
评价:
共有三个table:
单位
合同
合同单位
Unit 和 Contract 实体具有 many-to-many 关系,因此需要 ContractUnit 这是关联实体(或桥 table)。
步骤1:首先需要列出以下列:
Unit_id,面积(来自table单位)
Contract_value(美元)和contract_id(来自table 合同)
实际上,最终输出不需要 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 type/version 不 支持 window 函数甚至 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;
我有这三个表,每个合约可以绑定几个单位。 我需要的是同一合同中所有单位的字段“面积”的总和。
查询应如下所示。最后一个字段“价格分数”将是一个计算字段,因此我在 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
让我们剖析需求并将其分解为步骤。
评价:
共有三个table:
单位
合同
合同单位
Unit 和 Contract 实体具有 many-to-many 关系,因此需要 ContractUnit 这是关联实体(或桥 table)。
步骤1:首先需要列出以下列: Unit_id,面积(来自table单位)
Contract_value(美元)和contract_id(来自table 合同)
实际上,最终输出不需要 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 type/version 不 支持 window 函数甚至 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;