我有一个问题,我对此感到绝望,我有几天的数据分布,我想在全年以月和周为单位显示这些数据。
我在选择显示的数据(1月、9月(时遇到的月份问题,但我希望显示所选年份的所有月份,即使它们是空的。为此,我使自己成为";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')
错误是因为您正在将月份转换为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 | |||||||
---|---|---|---|---|---|---|---|
Januar | 0 | 0 | |||||
2月 | 0 | 0 | April | 0 | td style="text-align:left;">Mai0 | 0Juni | |
Juli | 0 | August | |||||
9月 | 1 | 1 | |||||
十月 | |||||||
11月 | 0 | 0 | |||||
Dezember | 0 | 0 |