Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Sql 将月份的总值分配给每月的每一天_Sql_Postgresql - Fatal编程技术网

Sql 将月份的总值分配给每月的每一天

Sql 将月份的总值分配给每月的每一天,sql,postgresql,Sql,Postgresql,预期结果: 正如您在我的表格中所看到的,我有分配到每个月最后一天的总固定成本 在我的结果中,我想将这一固定成本总额分配到每月的每一天。 因此,我尝试使用以下查询: SELECT s.sales_date, s.country, s.sales_volume, f.fix_costs FROM sales s JOIN (SELECT ((date_trunc('MONTH', sales_date) + INTERVAL '1 MONTH - 1 DAY')::date) AS

预期结果:

正如您在我的表格中所看到的,我有分配到每个月最后一天的总固定成本

在我的结果中,我想将这一固定成本总额分配到每月的每一天。 因此,我尝试使用以下查询:

SELECT
s.sales_date, 
s.country,
s.sales_volume,
f.fix_costs
FROM sales s

JOIN

  (SELECT 
  ((date_trunc('MONTH', sales_date) + INTERVAL '1 MONTH - 1 DAY')::date) AS month_ld,
  SUM(fix_costs) AS fix_costs
  FROM sales
  WHERE country = 'None'
  GROUP BY month_ld) f ON f.month_ld = LAST_DAY(s.sales_date)

WHERE country <> 'None'
GROUP BY 1,2,3;
对于此查询,我在LAST_DAYs.sales_date上得到一个错误,因为此表达式在PostgresSQL中不存在。 但是,我不知道如何正确地替换它以获得预期的结果

你能帮我吗


如果我理解正确,请使用窗口功能:

select s.*,
       sum(fix_costs) over (partition by date_trunc(sales_date)) as month_fixed_costs
from sales;
注意,这假设固定成本在其他日期为空或0-这对于问题中的数据是正确的


如上所述,您可以在日期组上使用“求和”窗口功能。然后,您需要在之后过滤无记录

感谢全面的解释和日期计算公式。对于我的文档,如果你想按照自己的方式来做,我也可以使用@Michi,我建议使用窗口函数来简化代码。请参阅我编辑的答案。
SELECT
s.sales_date, 
s.country,
s.sales_volume,
f.fix_costs
FROM sales s

JOIN

  (SELECT 
  ((date_trunc('MONTH', sales_date) + INTERVAL '1 MONTH - 1 DAY')::date) AS month_ld,
  SUM(fix_costs) AS fix_costs
  FROM sales
  WHERE country = 'None'
  GROUP BY month_ld) f ON f.month_ld = LAST_DAY(s.sales_date)

WHERE country <> 'None'
GROUP BY 1,2,3;
select s.*,
       sum(fix_costs) over (partition by date_trunc(sales_date)) as month_fixed_costs
from sales;
SELECT
    s1.sales_date,
    s1.country,
    s1.sales_volume,
    s2.fix_costs
FROM sales s1
JOIN sales s2 ON s1.country <> 'None' AND s2.country = 'None' 
    AND date_trunc('month', s1.sales_date) = date_trunc('month', s2.sales_date)
SELECT
    *
FROM (
    SELECT
        sales_date,
        country,
        sales_volume,
        SUM(fix_costs) OVER (PARTITION BY date_trunc('month', sales_date)) as fix_costs
    FROM sales 
) s
WHERE country <> 'None'