Sql 跨两个表的聚合函数

Sql 跨两个表的聚合函数,sql,postgresql,Sql,Postgresql,我需要一个查询,它可以跨两个或更多的表计算多个函数。但一旦我导入了多个表,就会得到由连接条件引起的奇怪结果。首先,我使用了这个查询: SELECT sum(s.bedarf2050_kwh_a) AS bedarf_kWh_a, sum(s.bedarf2050_kwh_a)*0.2 AS netzverlust, sum(s.bedarf2050_kwh_a) + sum(s.bedarf2050_kwh_a)*0.2 AS gesamtbedarf, sum(pv.modulflaeche

我需要一个查询,它可以跨两个或更多的表计算多个函数。但一旦我导入了多个表,就会得到由连接条件引起的奇怪结果。首先,我使用了这个查询:

SELECT
sum(s.bedarf2050_kwh_a) AS bedarf_kWh_a, 
sum(s.bedarf2050_kwh_a)*0.2 AS netzverlust,
sum(s.bedarf2050_kwh_a) + sum(s.bedarf2050_kwh_a)*0.2 AS gesamtbedarf,
sum(pv.modulflaeche_qm) AS instbar_modulflaeche_qm

FROM 
siedlungsareale_wbm s, pv_st_potenziale_gis pv

WHERE 
s.vg_solar LIKE '%NWS 2%' 
AND 
ST_Covers(s.geom, pv.geom);
使用带DISTINCT的sum返回一些精确值,但仅当所有输入值都是唯一的时。这不是我可以使用的解决方案:

SELECT 
SUM(DISTINCT s.bedarf2050_kwh_a) AS bedarf_kWh_a,
SUM(DISTINCT s.bedarf2050_kwh_a)*0.2 AS netzverlust,
SUM(DISTINCT s.bedarf2050_kwh_a) + SUM(DISTINCT s.bedarf2050_kwh_a)*0.2 AS gesamtbedarf,
SUM(pv.modulflaeche_qm) AS instbar_modulflaeche_qm,
(SUM(DISTINCT s.bedarf2050_kwh_a) + SUM(DISTINCT s.bedarf2050_kwh_a)*0.2)*0.01499 AS startwert_speichergroesse

FROM
siedlungsareale_wbm s, pv_st_potenziale_gis pv

WHERE
pv.vg_solar LIKE '%NWS 2%'

AND
ST_Covers(s.geom, pv.geom);

如果DISTINCT引用的是另一列,而不是要在函数中使用的列,那么DISTINCT将是一个合适的解决方案。或某个子查询或其他联接条件。但我尝试的都是错误或错误的结果值

我发现了一些使用UNION处理多个表上的聚合函数的解决方案。但当我试图在查询中匹配代码时,我出现了错误

例如:

希望有人能帮助我为我的任务建立一个工作查询

[编辑]简单示例

西德隆萨雷尔酒店

id | bedarf2050_kWh_a | a | b | c | vg_solar | geom
---|------------------|---|---|---|----------|-----
1  |               20 |   |   |   | NWS 2    | xxxxx
2  |               10 |   |   |   | NWS 2    | xxxxx
3  |               30 |   |   |   | NWS 2    | xxxxx
4  |                5 |   |   |   | NWS 2    | xxxxx
5  |               15 |   |   |   | NWS 2    | xxxxx

sum = 80
pv_st_potenziale_gis

id |  modulflaeche_qm | x | y | z | geom
---|------------------|---|---|---|---------
1  |            10    |   |   |   | xxxxx
2  |            10    |   |   |   | xxxxx
3  |            20    |   |   |   | xxxxx
4  |            10    |   |   |   | xxxxx
5  |            30    |   |   |   | xxxxx
6  |            30    |   |   |   | xxxxx
7  |            10    |   |   |   | xxxxx
8  |            10    |   |   |   | xxxxx
9  |            10    |   |   |   | xxxxx
10 |            10    |   |   |   | xxxxx

sum = 140


SELECT sum(s.bedarfxxxx) AS bedarf, sum(pv.mflaeche) As mflaeche
FROM siedlungsareale s, pv_st_potenziale_gis pv
WHERE s.vg_solar LIKE '%NWS 2%' AND ST_Covers(s.geom,pv.geom);
预期正确结果:

bedarf   | mflaeche
---------|----------
      80 |      140
在那里,我将从“siedlungsareale”中获取列“bedarf”的所有值的总和,并从“pv_st_potenziale_gis”中获取列“mflaeche”的所有值的总和

但由于交叉连接条件,使用此查询的列“bedarf”的实际计算值要高得多

另一个查询:

SELECT sum(DISTINCT s.bedarfxxxx) AS bedarf, sum(DISTINCT pv.mflaeche) As mflaeche
FROM siedlungsareale s, pv_st_potenziale_gis pv
WHERE s.vg_solar LIKE '%NWS 2%' AND ST_Covers(s.geom,pv.geom);
返回:

bedarf   | mflaeche
---------|-----------
     80  |      60

“bedarf”的准确值,因为这些值是唯一的。但对于mflaeche,某些值出现多次,结果是错误的

您能创建简单的示例输入和所需的输出吗?是的,我可以自己来演示如何聚合联接表,但毕竟,这是你的问题。你不能写一些像selectsomeid,sum。。。从表1 t1左连接选择someid,求和。。。从表2中,按t2上的someid t2分组。someid=t1.someid?这样,您可以在合并之前对第二个结果进行分组,并避免相乘。使用DISTINCT显然是错误的方法。如果DISTINCT引用的是另一列,而不是要在函数中使用的列,DISTINCT将是正确的解决方案。对要操作聚合函数的另一列使用group by。是否已检查(未聚合)连接条件ST_是否覆盖。。。实际上,当使用SELECT*时,会产生正确的元组集。问题是,我不想以任何方式对结果进行分组。唯一需要的输出应该是带有聚合计算的一行