SQL Query返回每个月的第一个数据

时间:2014-10-24 10:00:39

标签: sql oracle oracle11g

我想在过去12个月内找到每个月初部门的员工人数。

我可以使用12个单独的查询获得所需的输出,UNION ALL类似于以下内容:


SELECT
    o.DEP_ID
   ,COUNT(o.STAFF_ID) STAFF_COUNT
   ,TRUNC(SYSDATE,'MON') EFFECTIVE_DATE
FROM
    OCCUPANCIES o
WHERE
    o.START_DATE <= TRUNC(SYSDATE,'MON')
AND o.END_DATE >= TRUNC(SYSDATE,'MON')
GROUP BY
    o.DEP_ID
   ,TRUNC(SYSDATE,'MON')
UNION ALL
SELECT
    o.DEP_ID
   ,COUNT(o.STAFF_ID) STAFF_COUNT
   ,ADD_MONTHS(TRUNC(SYSDATE,'MON'),-1) EFFECTIVE_DATE
FROM
    OCCUPANCIES o
WHERE
    o.START_DATE <= ADD_MONTHS(TRUNC(SYSDATE,'MON'),-1)
AND o.END_DATE >= ADD_MONTHS(TRUNC(SYSDATE,'MON'),-1)
GROUP BY
    o.DEP_ID
   ,ADD_MONTHS(TRUNC(SYSDATE,'MON'),-1)

这使我的输出类似于以下内容:


output


不幸的是,我的真实查询很长,编辑它变得笨拙,至少可以说是因为我每次都在12个地方进行相同的更改。

有没有办法在单个SELECT语句中执行此操作?

编辑:我已将示例上传到SQLFiddle

1 个答案:

答案 0 :(得分:1)

您可以生成有效日期列表并在查询中使用

SELECT
    o.DEP_ID
   ,COUNT(o.STAFF_ID) STAFF_COUNT
   ,dt.EFFECTIVE_DATE
FROM
    OCCUPANCIES o,

    (SELECT ADD_MONTHS(TRUNC(SYSDATE,'MON'), 1-LEVEL) EFFECTIVE_DATE 
    FROM dual
    CONNECT BY LEVEL <=12) dt
WHERE
    dt.EFFECTIVE_DATE BETWEEN o.START_DATE AND o.END_DATE
GROUP BY
    o.DEP_ID
   ,dt.EFFECTIVE_DATE