如何列出具有条件值和非缺失记录的记录

时间:2017-07-18 15:59:13

标签: sql join logic union nested-queries

我有一个视图,可以生成下图所示的结果。我需要逻辑方面的帮助。

要求: 在过去两年中在所有宿舍中实现不低于100%目标的所有员工的名单。

"的"在两个不同的季度收到90%。不应列出收到低于100%的员工 请注意" A "没有为 Q2-2016 工作。不应列出在该季度没有工作的员工 " C "是唯一一个完整工作两年的人,每个季度都收到100%。

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

1 个答案:

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

中所述