首页 > 解决方案 > PostgreSQL-10.5 联合拥有单条记录(组合空值)

问题描述

我正在使用 PostgreSQL-10.5。我有两个表格可以从中生成报告。我需要使用ilkokuma(first reading) 和sonokuma(last reading) 列进行一些计算。

我可以在一定程度上进行计算。我会再添加一些。我看不出如何join在单个 SQL 中使用同一张表并尝试使用两个 use union。下面是我当前的 SQL,我尝试将这两种计算结合起来。

SELECT 
  faturadata.*, 
    (SELECT DATE_PART('days', DATE_TRUNC('month', ilkokuma) + '1 MONTH'::INTERVAL - '1 DAY'::INTERVAL)) as ilkokuma_gun_sayisi,
    sabityanma.deger as ilkokuma_deger,
    (SELECT DATE_PART('days', DATE_TRUNC('month', ilkokuma) + '1 MONTH'::INTERVAL - '1 DAY'::INTERVAL)) * sabityanma.deger as ilkokuma_carpim,
    null as sonokuma_gun_sayisi,
    null as sonokuma_deger,
    null as sonokuma_carpim 
FROM 
  faturadata
left join sabityanma on sabityanma.yil = date_part('year', ilkokuma) and sabityanma.ay = date_part('month', ilkokuma)

union

SELECT 
  faturadata.*, 
    null as ilkokuma_gun_sayisi,
    null as ilkokuma_deger,
    null as ilkokuma_carpim,
    (SELECT DATE_PART('days', DATE_TRUNC('month', sonokuma) + '1 MONTH'::INTERVAL - '1 DAY'::INTERVAL)) as sonokuma_gun_sayisi,
    sabityanma.deger as sonokuma_deger,
    (SELECT DATE_PART('days', DATE_TRUNC('month', sonokuma) + '1 MONTH'::INTERVAL - '1 DAY'::INTERVAL)) * sabityanma.deger as sonokuma_carpim
FROM 
  faturadata
left join sabityanma on sabityanma.yil = date_part('year', sonokuma) and sabityanma.ay = date_part('month', sonokuma)

结果是

id       tesisat     trf     kwh     tahakkuk     ilkokuma     sonokuma     ilkokuma_gun_sayisi     ilkokuma_deger     ilkokuma_carpim     sonokuma_gun_sayisi     sonokuma_deger     sonokuma_carpim
2023772  4024546     400     1765    2016-08-31   2016-07-31   2016-08-31   31                      9                  279               
2023772  4024546     400     1765    2016-08-31   2016-07-31   2016-08-31                                                                  31                      11                 341
2023773  4024545     400     3876    2016-08-31   2016-07-31   2016-08-31   31                      9                  279               
2023773  4024545     400     3876    2016-08-31   2016-07-31   2016-08-31                                                                  31                      11                 341
2023774  4024543     400     2126    2016-08-31   2016-07-31   2016-08-31   31                      9                  279               
2023774  4024543     400     2126    2016-08-31   2016-07-31   2016-08-31                                                                  31                      11                 341

可以看出,SQL 正在复制记录。我需要做的是对两个计算都有一个记录。

我想不出我怎么能做到这一点。

标签: postgresql

解决方案


下次请缩短你的例子:)

我删除了测试表中的一些列

id          tahakkuk     ilkokuma     sonokuma     ilko_gun_say   ilko_deger   sono_gun_say   sono_gun_deger
2023772     2016-08-31   2016-07-31   2016-08-31   31             9
2023772     2016-08-31   2016-07-31   2016-08-31                               31             11
2023773     2016-08-31   2016-07-31   2016-08-31   31             9
2023773     2016-08-31   2016-07-31   2016-08-31                               31             11

你可以做一个简单的组来聚合你的行:

SELECT
    id, tahakkuk, ilkokuma, sonokuma,
    MAX(ilko_gun_say) as ilko_gun_say,
    MAX(ilko_deger) as ilko_deger,
    MAX(sono_gun_say) as sono_gun_say,
    MAX(sono_gun_deger) as sono_gun_deger
FROM 
    <YOUR QUERY HERE>
GROUP BY
    id, tahakkuk, ilkokuma, sonokuma

演示:db<>小提琴


我没有考虑对您的查询进行一般优化,因为我对您的语言感到困惑。但是有很多代码重复。我想有很多需要优化的地方——也许是 CTE(https://www.postgresql.org/docs/current/static/queries-with.html)?


推荐阅读