(SQL)如何使用 PIVOT 从 1-31 列下的日期获取缺席 "day"

(SQL)How to Get absence "day" from date under 1-31 column using PIVOT

我有一个 table 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 应该出现在 header 中,如果在过去的月份或季度的 01 日有任何缺席,那么该值应该低于 1 ,如果有月份日期没有值,比如在上述情况下从 07 日到 11 日没有值,那么输出应该显示数字,但不应在其下提供任何值。

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

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

创建一个包含所有日期的列,并使用 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