Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
连接PostgreSQL时的SQL拆分值_Sql_Postgresql_Join - Fatal编程技术网

连接PostgreSQL时的SQL拆分值

连接PostgreSQL时的SQL拆分值,sql,postgresql,join,Sql,Postgresql,Join,我有一个名为生产成本的表格 product | per_day_product_cost ------------+------------------------- powder | 40 CREATE TABLE production_cost( product VARCHAR(50), per_day_product_cost INT ); INSERT INTO production_cost VALUES ('powder' ,40); CREAT

我有一个名为
生产成本
的表格

product     | per_day_product_cost
------------+-------------------------
powder      | 40
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');
另外,我还有另一个表,名为
每日生产量

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
我在使用count时尝试了case,但为了达到最终的效果,我已经没有什么想法了。 我不熟悉后端查询,所以如果有其他方法,也请告诉我。

使用连接和子查询

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

尝试使用下面的子查询计算产品类型计数,然后使用计数除以产品的总成本

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

您可以尝试使用
COUNT
窗口功能从
每日生产
表中通过
产品
获取总计数。然后编写一个子查询,从
生产成本
中获取每个
产品
的总成本

product     | per_day_product_cost
------------+-------------------------
powder      | 40
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 |

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 |

免责声明:只有在所有单一产品的成本始终完全相同的情况下,这才有效。如果一种成分可能是100美元的黄金,而另一种成分可能是10美元的木材,那么这就不起作用了。我假设每个产品的成分数量是整个产品成本的一部分


使用窗口功能
计数
():

COUNT
窗口函数将行分组。在您的情况下,将为每个日期和产品创建一个组。然后统计这些组中的所有行。此结果通过您的
每日生产成本
作为分隔符,并设置为每行的新列



请注意,“日期”在Postgres中是一个保留字。最好重命名您的列。我将其重命名为“prod_date”。

这是您唯一的用例吗?或者可以是3倍辣椒和2倍滑石粉?你觉得每种产品的金额是多少?你怎么知道在你的例子中,成本=40不是来自2x辣椒?@S-Man
日期
产品
类型
日常生产
的组合键。所有单一产品的成本总是相同的?如果有4种成分,那么每个成分的成本是10?因此,
每日生产
中的行数是
每日产品成本
的除数?我没有相同的表。但我的结构与子查询相同,而不是表。对您提供的答案进行修改。将让您知道。@D-Shih您为什么要使用
SUM()
子选择?表中提到的是“每日成本”。我为什么要总结这些价值观?我是否误解了用例?很好的解决方案(+1)。您可能应该将日期添加到分区中,因为开瓶器意味着日期是键的一部分。如果有一个日期,粉末是由一些神奇的神秘材料制成的,那么就只有一种成分,成本为40美元。或者,当有两天的时间用滑石粉和辣椒粉制成粉末时,你的切分器会增加到4。我认为这是不可能的。看这个小提琴:请将日期更改为账单日期或其他任何东西,因为日期是数据类型之一