跨两个表的聚合函数

时间:2013-10-23 10:31:32

标签: sql postgresql

我需要进一步处理例程查询,该查询计算两个(可能更多)表中的几个函数。但是一旦我导入了多个表格,我就会因为JOIN条件而导致奇怪的结果。首先我使用了那个查询:

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将是一个正确的解决方案。或者一些子查询或其他JOIN条件。但我尝试过的只是错误或错误的结果值。

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

例如那样: Can SQL calculate aggregate functions across multiple tables?

希望有人可以帮助我为我的任务构建一个有效的查询。

[编辑]简单的例子

siedlungsareale

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'列的实际计算值远高于CROSS JOIN条件。

另一个问题是:

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,其中一些值出现了几次,结果是错误的。

0 个答案:

没有答案