Oracle SQL显示一年中的所有月份,包含或不包含值ORA-01841



我有一个问题,我对此感到绝望,我有几天的数据分布,我想在全年以月和周为单位显示这些数据。

我在选择显示的数据(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,这是当月所有可能的日期和时间。

td style="text-align:left;">Mai
GRD_ROW_ID
Januar00
2月00April000Juni
Juli0August
9月11
十月
11月00
Dezember00

最新更新