我在为YTD销售添加专栏时遇到困难(从2017年1月1日到最后一个周日)。我已经制作了两个列,为员工提供每周销售额(每周日结束一周,这就是我使用 date_trunc 功能的原因,因此无需每周更改日期进出)。我使用合并的原因是由于员工不是每周都进行销售,所以我需要在他们的名字旁边显示一个零(我从Employees表中获取所有员工的列表)。我当前语法的问题是YTD只是模拟本周列的结果。如何在语法中添加YTD列?我将不胜感激。
select coalesce(Employees,'Total') as "Employees", "This Week", "YTD"
from
(select t2.Employees,coalesce(sum(t1.Sales),0) "This Week", coalesce(sum (t1.Sales),0) "YTD"
from Employees t2
left join Sales t1 ON Employees = Employees
and "Week" = date_trunc('week', now())::date - 1
group by rollup(t2.Employees)) Z
上述代码段的结果:
Employees This Week YTD
Derek Jeter 0 0
Barry Bonds 3 3
Luis Gonzalez 6 6
Mike Piazza 10 10
Jason Witten 0 0
Lebron James 7 7
Daryl Wade 5 5
Eli Manning 11 11
Total 42 42
答案 0 :(得分:1)
更新 - 来自评论的您只有"周"价值,而不是一个确切的销售日期,所以我的原始代码仅用于查看"当前年份"不管用。更新以建议处理此
的选项目前您只需在基础结果集中包含当前一周的数据;那不会起作用。您需要将结果集包含在任何最终输出中使用的所有数据,然后相应地过滤每个输出。
我的理解是,您的数据仅将销售归因于一周 - 而不是特定的一天 - 因此您需要选择应该首先包含哪一周。对于2017年,因为这一年从星期日开始,这可能不是问题;但一般来说,您需要决定是否计算从上一年开始但到当年结束的一周的销售额。
要排除它们,你可以做到
select coalesce(t2.Employees, 'Total') as "Employees"
, coalesce(sum(case when "Week" = date_trunc('week', now())::date - 1
then t1.Sales
end),0) "This Week"
, coalesce(sum(t1.Sales),0) "YTD"
from Employees t2
left join Sales t1
ON Employees = Employees
and "Week" <= date_trunc('week', now())::date - 1
and "Week" >= date_trunc('year', 'now())::date
group by rollup(t2.Employees)
要包含它们,我想你可以这样做
select coalesce(t2.Employees, 'Total') as "Employees"
, coalesce(sum(case when "Week" = date_trunc('week', now())::date - 1
then t1.Sales
end),0) "This Week"
, coalesce(sum(t1.Sales),0) "YTD"
from Employees t2
left join Sales t1
ON Employees = Employees
and "Week" <= date_trunc('week', now())::date - 1
and "Week" >= date_trunc('week',
date_trunc('year', 'now())::date)
group by rollup(t2.Employees)