(SQL)如何使用 PIVOT 获取 1-31 列下的缺勤"day"



我有一个表abs_details给出如下数据-

PERSON_NUMBER       ABS_DATE            ABS_TYPE_NAME               ABS_DAYS
1010            01-01-2022              PTO                             1
1010            06-01-2022              PTO                             0.52
1010            02-02-2022              VACATION                        1
1010            03-02-2022              VACATION                        0.2
1010            01-12-2021              PTO                             1
1010            02-12-2021              sick                            1                   
1010            30-12-2021              sick                            1
1010            30-01-2022              SICK                            1

我希望这些数据以如下方式显示:

PERSON_NUMBER          ABS_TYPE_NAME   1  2   3 4 5 6    7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31   
1010                    PTO             2            0.52
1010                    VACATION           1   0.2
1010                    SICK                                           1                                                        2

对于日期,1-31 should应该出现在标题中,如果在过去的月份或季度的01号有任何缺失,那么该值应该在1以下,如果当月日期没有值,那么在上述情况下,从07日到11日没有值,那么输出应该显示数字,但不应该在它下面提供值。

在SQL中是否可行?? 我有一个想法,我们可以使用pivot,但如何修复1-31头,并每天给出值。有什么建议吗?

  • 如果我通过多个季度,即Q1(1 - 3), Q2(4 - 6),它应该总结这两个季度之间的日期之间的值。if Just q1 then only q1 result
  • 如果我传递多个月,那么它应该显示这多个月缺席类型的值的总和。

我将在参数中传递年份,上面两个应该考虑我传递的年份。

创建一个包含所有日期的列,并在oracle中使用pivot函数向上枢轴。

SELECT *
FROM
( 
SELECT PERSON_NUMBER,
EXTRACT(DAY FROM TO_DATE(ABS_DATE)) AS DAY_X,
ABS_TYPE_NAME,
ABS_DAYS
FROM TABLE
-- Add additional filter here which you want
) 
PIVOT(SUM(ABS_DAYS)
FOR DAY_X IN (0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31))

Db fiddle - https://dbfiddle.uk/?rdbms=oracle_21&fiddle=ad3af639235f7a6db415ec714a3ee0d9

最新更新