我有一個令我絕望的問題,我的資料分布在幾天內,并希望以月為單位顯示全年的資料,并以幾周為單位顯示一次。
我在選擇我的資料中顯示的月份(一月、九月)存在問題,但我希望顯示選定年份的所有月份,即使它們是空的。為此,我將自己設為“WITH”(已復制),現在嘗試加入,但收到 ORA-01841 錯誤。
以及如何實作整個構造以僅顯示周。
WITH MONAT_ZAEHLER (MZ) AS
(
SELECT
TO_CHAR(ADD_MONTHS(TO_DATE('01.2022','MM.YYYY'),LEVEL -1),'Month', 'NLS_DATE_LANGUAGE = GERMAN') AS GRD_ROW_ID
FROM
DUAL
CONNECT BY LEVEL <= 12
)
SELECT
TO_CHAR(GEN_DATUM,'Month', 'NLS_DATE_LANGUAGE = GERMAN') AS GRD_ROW_ID
, COUNT( DISTINCT CASE
WHEN LP_BELEGUNG.ART = 1 THEN LP_BELEGUNG.LP_BELEGUNG_ID
ELSE NULL
END ) AS "1"
, COUNT( DISTINCT CASE
WHEN LP_BELEGUNG.ART = 2 THEN LP_BELEGUNG.LP_BELEGUNG_ID
ELSE NULL
END ) AS "2"
, COUNT( DISTINCT CASE
WHEN LP_BELEGUNG.ART = 3 THEN LP_BELEGUNG.LP_BELEGUNG_ID
ELSE NULL
END ) AS "3"
, COUNT( DISTINCT CASE
WHEN LP_BELEGUNG.ART = 99 THEN LP_BELEGUNG.LP_BELEGUNG_ID
ELSE NULL
END ) AS "99"
FROM
LP_BELEGUNG
FULL OUTER JOIN MONAT_ZAEHLER ON TRUNC(LP_BELEGUNG.GEN_DATUM, 'Month') = MONAT_ZAEHLER.MZ
WHERE
TO_CHAR(GEN_DATUM, 'YYYY') = '2022'
GROUP BY
TO_CHAR(GEN_DATUM,'Month', 'NLS_DATE_LANGUAGE = GERMAN')
uj5u.com熱心網友回復:
該錯誤是因為您將月份轉換為 CTE 中的名稱字串,然后嘗試再次將其轉換為GRD_ROW_ID別名。
解決方案與您之前的問題基本相同,但現在您希望 CTE 每月有一行 - 您正在這樣做,但您應該將其作為日期型別保留在 CTE 中,而不是在那里將其轉換為字串:
with cte (dt) as (
select add_months(date '2022-01-01', level - 1)
from dual
connect by level <= 12
)
...然后將該實際日期值轉換為字串:
SELECT
TO_CHAR(cte.dt, 'Month', 'NLS_DATE_LANGUAGE = GERMAN') AS GRD_ROW_ID
...
...并像以前一樣使用日期范圍外部連接到您的實際表:
FROM
cte
LEFT JOIN
LP_BELEGUNG
ON
LP_BELEGUNG.GEN_DATUM >= cte.dt AND LP_BELEGUNG.GEN_DATUM < add_months(cte.dt, 1)
GROUP BY
cte.dt
ORDER BY
cte.dt
...這次尋找GEN_DATUM大于或等于值的cte.dt值(再次,如前所述),即該月第一天的第一天的午夜;小于add_months(cte.dt, 1),即下個月第一天的第一天的午夜。所以對于 1 月,這將是 >= 2022-01-01 00:00:00 和 < 2022-02-01 00:00:00,這是該月所有可能的日期和時間。
| GRD_ROW_ID | ANZAHL_ART_1 | ANZAHL_ART_2 | ANZAHL_ART_3 | ANZAHL_ART_4 |
|---|---|---|---|---|
| 一月 | 0 | 0 | 0 | 0 |
| 二月 | 0 | 0 | 0 | 0 |
| 馬爾茲 | 0 | 0 | 0 | 0 |
| 四月 | 0 | 0 | 0 | 0 |
| 麥 | 0 | 0 | 0 | 0 |
| 朱尼 | 0 | 0 | 0 | 0 |
| 巨力 | 0 | 0 | 0 | 0 |
| 八月 | 0 | 0 | 0 | 0 |
| 九月 | 1 | 1 | 1 | 7 |
| 十月 | 0 | 0 | 0 | 0 |
| 十一月 | 0 | 0 | 0 | 0 |
| 十二月 | 0 | 0 | 0 | 0 |
小提琴
要在一年中的每一周獲得一行,您將再次執行類似的操作,但以 7 天為一組:
with cte (dt) as (
select date '2022-01-01' 7 * (level - 1)
from dual
connect by level <= 53
)
SELECT
TO_CHAR(cte.dt, 'YYYY-WW') AS GRD_ROW_ID
...
FROM
cte
LEFT JOIN
LP_BELEGUNG
ON
LP_BELEGUNG.GEN_DATUM >= cte.dt AND LP_BELEGUNG.GEN_DATUM < cte.dt 7
AND LP_BELEGUNG.GEN_DATUM < add_months(trunc(cte.dt, 'YYYY'), 12)
GROUP BY
cte.dt
ORDER BY
cte.dt
它在連接中有一個額外的檢查來阻止它,包括從第 53 周開始的資料,實際上是在下一年 - 我猜你會想要這樣做。
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/519901.html
標籤:sql甲骨文日期加入看法
