SQL разделяет значения при объединении PostgreSQL - PullRequest
0 голосов
/ 05 октября 2018

У меня есть таблица с именем production_cost.

product     | per_day_product_cost
------------+-------------------------
powder      | 40

И у меня есть еще одна таблица с именем daily_production.

date        | product    | type
------------+------------+----------
2018-09-09  | powder     | talcum
2018-09-09  | powder     | chilli

Мне нужно получить результаты из обеих таблицкоторый включается в столбец product.Поскольку общая стоимость за день составляет 40, мне нужно разделить значения по обоим типам продуктов, что приводит к

date        | product    | type     | cost
------------+------------+----------+--------
2018-09-09  | powder     | talcum   | 20
2018-09-09  | powder     | chilli   | 20

. Я пробовал использовать вариант подсчета, и у меня закончились идеи для достиженияконечный результат.Я новичок в серверных запросах, поэтому, если есть какой-то другой способ, сообщите мне об этом.

Ответы [ 5 ]

0 голосов
/ 05 октября 2018

Отказ от ответственности : Это работает, только если все отдельные продукты всегда имеют одинаковую стоимость.Если одним ингредиентом может быть золото с ценой 100, а другим - с 10, это больше не работает.Я предполагаю, что количество ингредиентов на продукт работает как разделитель для всей стоимости продукта.


Использование оконной функции COUNT (https://www.postgresql.org/docs/current/static/tutorial-window.html):

демо: db <> fiddle

SELECT 
    dp.*, 
    pc.per_day_product_cost / 
         count(*) OVER (PARTITION by pc.product, dp.prod_date) as cost
FROM
    daily_production dp
    JOIN production_cost pc
    ON dp.product = pc.product

Функция окна COUNT группирует строки в группы. В вашем случае группа создается для каждой даты и продукта. Затем она подсчитывает все строки в этих группах. Этот результатберется в качестве разделителя через ваш per_day_production_cost и устанавливается как новый столбец в каждой строке.


Обратите внимание, что «дата» является зарезервированным словом в Postgres. Было бы лучше переименовать ваш столбец. Iпереименовал его в "prod_date".

0 голосов
/ 05 октября 2018
select 
    d.date, 
    d.product, 
    d.type, 
    p.per_day_product_cost/(select count(1) 
                            from daily_production d1 
                            where d1.product=d.product and d1.date=d.date) cost 
from daily_production d,production_cost p 
where d.product=p.product;
0 голосов
/ 05 октября 2018

Попробуйте ниже с помощью подзапроса для подсчета количества типов продукта и используйте, а затем подсчитайте, чтобы разделить общую стоимость продукта

select d.date,d.product,d.type,(p.per_day_product_cost/c) as cost
from product p
inner join
(select product,count(type) as c from daily_production
group by product)a on p.product=a.product
inner join daily_production d on p.product=d.product
0 голосов
/ 05 октября 2018

Вы можете попытаться использовать оконную функцию COUNT, чтобы получить общее количество по product из таблицы daily_production.затем напишите подзапрос, чтобы получить product общую стоимость от production_cost.

CREATE TABLE  production_cost(
   product VARCHAR(50),
   per_day_product_cost INT
);

INSERT INTO production_cost VALUES ('powder' ,40);

CREATE TABLE daily_production(
   date   TIMESTAMP, product VARCHAR(50), type VARCHAR(50)
);



INSERT INTO daily_production VALUES ('2018-09-09', 'powder','talcum');
INSERT INTO daily_production VALUES ('2018-09-09', 'powder','chilli');

Запрос 1 :

SELECT *,(
    select SUM(per_day_product_cost)  
    from production_cost pc
    WHERE pc.product = dp.product
    GROUP BY pc.product) /COUNT(*) OVER(PARTITION BY product ORDER BY product) as cost
FROM daily_production dp 

Результаты :

|                 date | product |   type | cost |
|----------------------|---------|--------|------|
| 2018-09-09T00:00:00Z |  powder | talcum |   20 |
| 2018-09-09T00:00:00Z |  powder | chilli |   20 |
0 голосов
/ 05 октября 2018

использовать объединение и подзапрос

select t1.*,t2.cost from 
(
 select p.* from production_cost c 
 join daily_production p
 on c.product=p.product
) as t1 join 
( 
select p.product, c.per_day_product_cost/count(p.product) as cost
  from production_cost c 
   join 
 daily_production p
on c.product=p.product
group by p.product,c.per_day_product_cost
) as t2 
on t1.product=t2.product


date                    product type   cost
09/09/2018 00:00:00     powder  talcum  20
09/09/2018 00:00:00     powder  chilli  20

Результат демо

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