显示年初至今的销售额

时间:2017-01-17 17:37:11

标签: sql postgresql

我在为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

1 个答案:

答案 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)