2017-07-18 65 views
0

我有一个视图可以生成下图中显示的结果。我需要逻辑帮助。如何使用条件值和非缺失记录列出记录

要求:全体员工的 名单谁在各方在过去的两年中取得了不低于100%目标。

B”在两个不同的季度获得90%。收到少于100%的员工不应被列出。
请注意,“A”不适用于Q2-2016。不应该列出没有为该季度工作的员工。
C”是唯一一个工作满两年,每季度收到100%的人。

编辑:添加的图像链接显示员工姓名,季度,年份和分数。 https://i.imgur.com/FIXR0YF.png

回答

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

描述