我有一个表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