【发布时间】:2016-02-15 20:40:20
【问题描述】:
我希望将以下查询添加为 Rails 应用程序中的数据库视图:
select
recruiters.full_name as recruiter,
advisors.advisor as agent,
sum(case when policies.week_number=1 then policies.premium else 0 end) as wk1,
sum(case when policies.week_number=2 then policies.premium else 0 end) as wk2,
sum(case when policies.week_number=3 then policies.premium else 0 end) as wk3,
sum(case when policies.week_number=4 then policies.premium else 0 end) as wk4,
sum(policies.premium) as total
from policies
join advisors on policies.advisor_id=advisors.id
join recruiters on advisors.recruiter_id=recruiters.id
where policies.current_status='T' or policies.current_status='I'
group by recruiters.full_name, advisors.advisor
在 select 语句中,我目前每周添加一个 sum 语句来创建新列(在代码中创建重复)。这将导致一整年的结果如下:
sum(case when policies.week_number=1 then policies.premium else 0 end) as wk1,
sum(case when policies.week_number=2 then policies.premium else 0 end) as wk2,
....
....
sum(case when policies.week_number=52 then policies.premium else 0 end) as wk52,
sum(case when policies.week_number=53 then policies.premium else 0 end) as wk53
结果如下:
Week 1:
RECRUITER | AGENT | WK1
----------|------------|----------
MC | DM | 523.8
MC | BO | 0.0
Week 2:
RECRUITER | AGENT | WK1 | WK2
----------|------------|----------|---------
MC | DM | 523.8 | -540.0
MC | BO | 0.0 | 0.0
....
Week 4:
RECRUITER | AGENT | WK1 | WK2 | WK3 | WK4 | TOTAL
----------|------------|----------|---------|----------|----------|---------
MC | DM | 523.8 | -540.0 | 358.44 | 510.0 | 852.24
MC | BO | 0.0 | 0.0 | 1543.72 | 0.0 | 1543.72
我想用类似于以下逻辑的东西重构代码:
-
在数据集中找到可用周数的 uniq 集:
=> [1,2,3,4] -
每个招聘人员/代理配对的每周总和政策。溢价。在 Rails 中,我会尝试这样的方法将 select 语句附加到查询中:
table_columns = [] [1,2,3,4].each do |i| table_columns << sum(case when policies.week_number=#{i} then policies.premium else 0 end) as wk#{i} end
例如,当policies.week_number=5 的数据可用时,将添加一年中所有53 周的“wk5”列等等。
是否可以在 Postgres 中创建一个函数来适应这样的重构?
仅供参考..我尝试使用交叉表,但我也在为分组招聘人员计算小计。
【问题讨论】:
-
为什么不用交叉表功能呢?您可以创建一个 plpgsql 函数,该函数将生成一个 sql。缺点是您需要从您的应用程序运行该查询。
-
您可以发布相关表的实际架构吗?否则我看不出如何根据季度、月份和天数生成结果
-
感谢@LongBeard_Boldy 我编辑了帖子以提供更清晰的信息。我尝试了交叉表功能,但不知道如何使用交叉表对组进行小计。我的sql知识有限,所以我改用了这种方法。此外,我删除了关于参数化查询的评论,因为它不是帖子的目标。
-
crosstab 的执行速度将比 、heavy sum 和 case 语句快得多
标签: ruby-on-rails postgresql refactoring