(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 并在每一天下方给出值。
有什么建议吗?
- 如果我通过多个季度,即 Q1(JAN-MAR)、Q2(APR-JUN),它应该总结这两个季度之间的日期之间的值。如果只有 q1 那么只有 q1 结果
- 如果我过了多个月,那么它应该显示在这多个月中缺勤类型的值的总和。
我将在参数中传递年份,以上两个应该考虑我传递的年份。
创建一个包含所有日期的列,并使用 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
我有一个 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 并在每一天下方给出值。 有什么建议吗?
- 如果我通过多个季度,即 Q1(JAN-MAR)、Q2(APR-JUN),它应该总结这两个季度之间的日期之间的值。如果只有 q1 那么只有 q1 结果
- 如果我过了多个月,那么它应该显示在这多个月中缺勤类型的值的总和。
我将在参数中传递年份,以上两个应该考虑我传递的年份。
创建一个包含所有日期的列,并使用 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