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:

单位

合同

合同单位

UnitContract 实体具有 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;