Объединение PostgreSQL-10.5 для одной записи (объединение нулевых значений) - PullRequest
0 голосов
/ 18 сентября 2018

Я использую PostgreSQL-10.5.У меня есть две таблицы для создания отчета.Мне нужно сделать некоторые вычисления, используя столбцы ilkokuma (первое чтение) и sonokuma (последнее чтение).

Я мог бы делать вычисления до определенного момента.Я буду добавлять еще.Я не мог понять, как я могу join одной таблицы в одном SQL и пытался использовать два использования 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 дублирует записи.Мне нужно иметь одну запись для обоих вычислений.

Я не мог понять, как я могу это сделать.

1 Ответ

0 голосов
/ 18 сентября 2018

Пожалуйста, сократите ваш пример в следующий раз немного:)

Мой Я удалил несколько столбцов в моей тестовой таблице

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

demo: db <> fiddle


Я не думал об общей оптимизации вашего запроса, потому что меня смущает ваш язык.Но много повторений кода.Я думаю, что есть что оптимизировать - возможно, с помощью CTE (https://www.postgresql.org/docs/current/static/queries-with.html)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...