Несколько объединений в одной таблице, дающей дубликаты данных - PullRequest
0 голосов
/ 02 июля 2018

Вот таблица sale_order, которая содержит CCNID

sale_orderid      client_channel_nameid
1                 1
2                 1
3                 2
4                 2
5                 2
6                 2
7                 1
8                 1

sale_order_item Таблица имеет sale_orderid в качестве внешнего ключа

sale_order_itemid       sale_orderid     order_date                     selling_price
42219                   1                2018-03-21 00:00:00            200 
28948                   2                2018-03-21 16:17:55            100
42220                   3                2018-03-21 00:00:00            300
13194                   4                2018-03-21 13:33:58            400
42839                   5                2018-03-20 07:54:29            550
42840                   6                2018-03-20 07:58:20            600
42086                   7                2018-03-20 00:00:00            700
11691                   8                2018-03-20 05:32:31            500

И я хочу получить сумму цены соида 21 и 20 дат в разных столбцах, сгруппированных по CCNID

client_channel_nameid   21      20
1                       300    1200
2                       700    1150

Я дважды присоединяюсь к заказу на продажу, что дает неверные результаты

select  ccn.client_channel_nameid, 
        round (sum(soi.selling_price)), 
        round(sum(soi1.selling_price)) 
from app.client_channel_name ccn 
  join app.sale_order so on so.client_channel_nameid =     ccn.client_channel_nameid
  inner join app.sale_order_item soi on soi.sale_orderid = so.sale_orderid
  join app.sale_order so1 on so1.client_channel_nameid = ccn.client_channel_nameid
  inner join app.sale_order_item soi1 on soi1.sale_orderid = so1.sale_orderid
where ccn.clientid = 1 
  and to_char(soi.order_date, 'DD-MM-YYYY') = '20-03-2018' 
  and to_char(soi1.order_date, 'DD-MM-YYYY') = '21-03-2018'
group by client_channel_nameid;

Ответы [ 2 ]

0 голосов
/ 02 июля 2018

Вы можете сгруппировать данные по CCNID, а затем суммировать selling_price только тогда, когда днем ​​ордера будет 21 или 20.

SELECT client_channel_nameid
     , SUM(CASE
               WHEN EXTRACT(day FROM order_date) = 21 THEN selling_price
               ELSE 0
             END) AS "21"
     , SUM(CASE
               WHEN EXTRACT(day FROM order_date) = 20 THEN selling_price
               ELSE 0
             END) AS "20"
FROM   sale_order so
JOIN   sale_order_item soi
  ON soi.sale_orderid = so.sale_orderid
GROUP  BY so.client_channel_nameid 
0 голосов
/ 02 июля 2018

Под запросом приведем желаемый результат. Из вашего вышеупомянутого опробованного решения и вопроса, который вы задали, я думаю, что вы ищете ровно 21 и 20 дат. Ниже необходимо внести небольшие изменения с дополнительными фильтрами для добавления дополнительных дат, например 22,23,24 ...

with sale_order(
  sale_orderid, client_channel_nameid
) as (
  select
    *
  from
    (
      values
        (1, 1),
        (2, 1),
        (3, 2),
        (4, 2),
        (5, 2),
        (6, 2),
        (7, 1),
        (8, 1)
    ) as x(
      sale_orderid, client_channel_nameid
    )
),
sale_order_item(
  sale_order_itemid, sale_orderid,
  order_date, selling_price
) as (
  select
    *
  from
    (
      values
        (
          42219, 1, '2018-03-21 00:00:00' :: timestamp,
          200
        ),
        (
          28948, 2, '2018-03-21 16:17:55' :: timestamp,
          100
        ),
        (
          42220, 3, '2018-03-21 00:00:00' :: timestamp,
          300
        ),
        (
          13194, 4, '2018-03-21 13:33:58' :: timestamp,
          400
        ),
        (
          42839, 5, '2018-03-20 07:54:29' :: timestamp,
          550
        ),
        (
          42840, 6, '2018-03-20 07:58:20' :: timestamp,
          600
        ),
        (
          42086, 7, '2018-03-20 00:00:00' :: timestamp,
          700
        ),
        (
          11691, 8, '2018-03-20 05:32:31' :: timestamp,
          500
        )
    ) as x(
      sale_order_itemid, sale_orderid,
      order_date, selling_price
    )
)
select
  client_channel_nameid,
  sum(selling_price) filter (where to_char(order_date, 'dd-mm-yy') = '21-03-2018') as date_21,
  sum(selling_price) filter (where to_char(order_date, 'dd-mm-yy') = '20-03-2018') as date_20
from
  sale_order so
  join sale_order_item soi on soi.sale_orderid = so.sale_orderid
group by
  so.client_channel_nameid


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