我有一个视图,可以生成下图所示的结果。我需要逻辑方面的帮助。
要求: 在过去两年中在所有宿舍中实现不低于100%目标的所有员工的名单。
"的乙"在两个不同的季度收到90%。不应列出收到低于100%的员工 请注意" A "没有为 Q2-2016 工作。不应列出在该季度没有工作的员工 " C "是唯一一个完整工作两年的人,每个季度都收到100%。
编辑:添加了显示员工姓名,季度,年份和分数的图片链接。 https://i.imgur.com/FIXR0YF.png
答案 0 :(得分:0)
逻辑非常简单,数学四分之一有点痛苦。
过去两年有8个季度,所以您只需要选择过去两年中所有员工姓名,目标> = 100%,按员工姓名分组,并应用HAVING子句限制输出给count(*) = 8
的员工。
要获取当前年份和季度,您可以使用以下表达式:
cast(extract('year' from current_date) as integer) as yr,
(cast(extract('month' from current_date) as integer)-1) / 3 + 1 as quarter;
从当前年度减去2,找到上一年和季度。如果将这些表达式放在子查询中,代码将更清晰,因为对于四分之一算术,您将需要多次这些表达式。要执行四分之一算术,您必须从存储的文本值中提取该四分之一的整数值。
总而言之,解决方案看起来应该是这样的:
select
employee
from
(select employee, cast(right(quarter,1) as integer) as qtr, year
from your_table
where target >= 100
) as tgt
cross join (
select
cast(extract('year' from current_date) as integer) as yr,
(cast(extract('month' from current_date) as integer)-1) / 3 + 1 as quarter
) as qtr
where
tgt.year between qtr.yr-1 and qtr.yr
or (tgt.year = qtr.yr - 2 and tgt.qtr > qtr.quarter)
group by
employee
having
count(*) = 8;
这是未经测试的。
如果您碰巧使用Postgres并期望进行大量的四分之一算术,您可能需要定义自定义数据类型,如A Year and Quarter Data Type for PostgreSQL
中所述