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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 如何使用date_part函数将每月值拆分为每天和国家_Postgresql - Fatal编程技术网

Postgresql 如何使用date_part函数将每月值拆分为每天和国家

Postgresql 如何使用date_part函数将每月值拆分为每天和国家,postgresql,Postgresql,CREATE TABLE sales ( id SERIAL PRIMARY KEY, country VARCHAR(255), sales_date DATE, sales_volume DECIMAL, fix_costs DECIMAL ); INSERT INTO sales (country, sales_date, sales_volume, fix_costs ) VALUES ('DE', '2020-01-03', '500',

CREATE TABLE sales (
    id SERIAL PRIMARY KEY,
    country VARCHAR(255),
    sales_date DATE,
    sales_volume DECIMAL,
    fix_costs DECIMAL
);

INSERT INTO sales
(country, sales_date, sales_volume, fix_costs
)
VALUES 

('DE', '2020-01-03', '500', '2000'),
('FR', '2020-01-03', '350', '2000'),
('None', '2020-01-31', '0', '2000'),

('DE', '2020-02-15', '0', '5000'),
('FR', '2020-02-15', '0', '5000'),
('None', '2020-02-29', '0', '5000'),

('DE', '2020-03-27', '180', '4000'),
('FR', '2020-03-27', '970', '4000'),
('None', '2020-03-31', '0', '4000');
预期结果:

sales_date   |   country    |   sales_volume   |     fix_costs
-------------|--------------|------------------|------------------------------------------
2020-01-03   |     DE       |       500        |     37.95  (= 2000/31 = 64.5 x 0.59)
2020-01-03   |     FR       |       350        |     26.57  (= 2000/31 = 64.5 x 0.41)
-------------|--------------|------------------|------------------------------------------
2020-02-15   |     DE       |         0        |     86.21  (= 5000/28 = 172.4 x 0.50)  
2020-02-15   |     FR       |         0        |     86.21  (= 5000/28 = 172.4 x 0.50)  
-------------|--------------|------------------|------------------------------------------    
2020-03-27   |     DE       |       180        |     20.20  (= 4000/31 = 129.0 x 0.16) 
2020-03-27   |     FR       |       970        |    108.84  (= 4000/31 = 129.0 x 0.84)   
-------------|--------------|------------------|-------------------------------------------

预期结果中的
fix_costs
列计算如下:

步骤1)获取每月固定成本的每日费率。
(2000/31=64.5;5000/29=172.4;4000/31=129.0)

步骤2)根据DE和FR国家/地区在销售额中所占的份额,将每日价值拆分为DE和FR国家/地区<代码>(500/850=0.59;350/850=0.41;180/1150=0.16;970/1150=0.84)

第3步)如果销售量为
0
则每日费率被拆分为DE和FR,如您所见
2020-02-15


MariaDB
中,我可以通过以下查询找到这个问题:

SELECT
s.sales_date, 
s.country,
s.sales_volume,

       (CASE WHEN SUM(sales_volume) OVER (PARTITION BY sales_date) > 0
             THEN ((s.fix_costs/ DAY(LAST_DAY(sales_date))) *
                   sales_volume / NULLIF(SUM(sales_volume) OVER (PARTITION BY sales_date), 0)
                  )
             ELSE (s.fix_costs / DAY(LAST_DAY(sales_date))) * 1 / SUM(country <> 'None') OVER (PARTITION by sales_date)
        END) AS imputed_fix_costs
        
FROM sales s
WHERE country <> 'None'
GROUP BY 1,2,3
ORDER BY 1;
选择
s、 销售日期,
s、 国家,,
s、 销售量,
(当总和(销售量)超过(按销售日期划分)>0时的情况)
然后((固定成本/天(最后一天(销售日期)))*
销售额/NULLIF(总和(销售额)超过(按销售额日期划分),0)
)
其他(s.固定成本/天(最后一天(销售日期))*1/总和(国家/地区“无”)超过(按销售日期划分)
结束)作为估算的固定成本
来自销售部
哪个国家“没有”
按1,2,3分组
1号订单;
然而,在
postgresql
中,我在
天(最后一天(销售日期))上得到一个错误

我试图用
(date\u part('DAY'),((date\u trunc('MONTH',s.sales\u date)+INTERVAL'1 MONTH-1 DAY')::date)替换此部分。

但是,这会导致另一个错误


我需要如何修改查询以获得预期结果?

Postgresql相当于
DAY(LAST\u DAY(sales\u date))

extract(日期(月),销售日期+间隔时间“1个月”-间隔时间“1天”)
表达式
SUM(国家/地区“无”)
也需要固定为

SUM(当国家/地区为“无”,然后为1或0结束时)
定义此兼容性函数可能是一个好主意:

create function last_day(d date) returns date as
$$
  select date_trunc('month', d + interval '1 month') - interval '1 day';
$$ language sql immutable;
然后第一个表达式变得简单

extract(day from last_day(sales_date))

Postgresql相当于
天(最后一天(销售日期))
是:

extract(日期(月),销售日期+间隔时间“1个月”-间隔时间“1天”)
表达式
SUM(国家/地区“无”)
也需要固定为

SUM(当国家/地区为“无”,然后为1或0结束时)
定义此兼容性函数可能是一个好主意:

create function last_day(d date) returns date as
$$
  select date_trunc('month', d + interval '1 month') - interval '1 day';
$$ language sql immutable;
然后第一个表达式变得简单

extract(day from last_day(sales_date))

我将创建一个函数来返回给定日期的最后一天(数字)——实际上是一个月的“长度”

create function month_length(p_input date) 
  returns integer
as
$$
  select extract(day from (date_trunc('month', p_input) + interval '1 month - 1 day'));
$$
language sql 
immutable;
然后可以将查询编写为:

select sales_date, country, 
       sum(sales_volume),
       sum(fix_costs_per_day * cost_factor) 
from (       
  select id, country, sales_date, sales_volume, fix_costs, 
         fix_costs / month_length(sales_date) as fix_costs_per_day,
         case 
            when sum(sales_volume) over (partition by sales_date) > 0 
              then sales_volume::numeric / sum(sales_volume) over (partition by sales_date)
            else sales_volume::numeric / 2
         end as cost_factor
  from sales
  where country <> 'None'
) t
group by sales_date, country
order by sales_date, country
选择销售日期、国家/地区、,
总额(销售量),
总和(每天固定成本*成本系数)
由(
选择id、国家、销售日期、销售量、固定成本、,
固定成本/月长(销售日期)为固定成本/日,
案例
当总和(销售量)超过(按销售日期划分)>0时
然后销售数量::数字/总和(销售数量)超过(按销售日期划分)
其他销售数量::数字/2
作为成本因素结束
来自销售
哪个国家“没有”
)t
按销售日期、国家/地区分组
按销售日期、国家/地区列出的订单

我将创建一个函数来返回给定日期的最后一天(数字)——实际上是该月的“长度”

create function month_length(p_input date) 
  returns integer
as
$$
  select extract(day from (date_trunc('month', p_input) + interval '1 month - 1 day'));
$$
language sql 
immutable;
然后可以将查询编写为:

select sales_date, country, 
       sum(sales_volume),
       sum(fix_costs_per_day * cost_factor) 
from (       
  select id, country, sales_date, sales_volume, fix_costs, 
         fix_costs / month_length(sales_date) as fix_costs_per_day,
         case 
            when sum(sales_volume) over (partition by sales_date) > 0 
              then sales_volume::numeric / sum(sales_volume) over (partition by sales_date)
            else sales_volume::numeric / 2
         end as cost_factor
  from sales
  where country <> 'None'
) t
group by sales_date, country
order by sales_date, country
选择销售日期、国家/地区、,
总额(销售量),
总和(每天固定成本*成本系数)
由(
选择id、国家、销售日期、销售量、固定成本、,
固定成本/月长(销售日期)为固定成本/日,
案例
当总和(销售量)超过(按销售日期划分)>0时
然后销售数量::数字/总和(销售数量)超过(按销售日期划分)
其他销售数量::数字/2
作为成本因素结束
来自销售
哪个国家“没有”
)t
按销售日期、国家/地区分组
按销售日期、国家/地区列出的订单