Oracle中的动态透视-此错误

z9smfwbn  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(73)

SELECT * FROM(SELECT A,DATE,SELECT(B)FROM表GROUP BY A,DATE)枢轴XML(SUM(B)FOR DATE IN(&x))
其中x的输入为:(列出本周的星期日和随后的4个星期日)
select listagg("||DT|| '' AS'||dt,',')在组内(按dt排序)从(选择 * 从(选择trunc(sysdate,'DAY')-1 +级别dt从双连接按级别<=(sysdate+30- sysdate))其中to_char(dt,'fmday')= '星期日');
当我执行此操作时,它在ORA-01858上出现错误,在需要数字字符的地方发现了非数字字符等。
期望执行查询

mbzjlibv

mbzjlibv1#

您的代码似乎试图执行动态透视,计算当前日期和接下来29天内每个星期天出现的B值。
您不需要动态轴心。只需过滤表以获取透视前的星期日,然后根据日期之前的星期日数量进行透视(在接下来的30天内,将始终有4个或5个星期日)。
您也不需要使用任何特定于语言的代码,因为您可以使用TRUNC(date_value, 'IW')来查找ISO周的开始(通常是周一午夜),然后周日是ISO周开始前的1天。

SELECT *
FROM   (
  SELECT A,
         (TRUNC("DATE") - (TRUNC(SYSDATE, 'IW') - 1)) / 7 AS weeknum,
         b
  FROM   "TABLE"
  WHERE  TRUNC("DATE") - TRUNC("DATE", 'IW') = 6 -- Sundays
  AND    "DATE" >= TRUNC(SYSDATE)
  AND    "DATE" <  TRUNC(SYSDATE) + 30
) PIVOT (
  COUNT(B)
  FOR weeknum IN (
    1 AS week1,
    2 AS week2,
    3 AS week3,
    4 AS week4,
    5 AS week5
  )
)
  • 注意:TABLEDATE是保留字,不能用作无引号的标识符。最好的做法是用一个更具描述性的名称来命名你的表和列,但是如果你必须使用TABLEDATE(请不要使用),那么你需要在所有使用它们的地方使用带引号的标识符(和正确的大小写)。

其中,对于样本数据:

CREATE TABLE "TABLE" (a, "DATE", B) AS
SELECT 1, TRUNC(SYSDATE, 'IW') - 1 + 7*LEVEL, 1 FROM DUAL CONNECT BY LEVEL <= 5;

它生成值:
| 一|日期|B|
| --|--|--|
| 1 |2023-10-01 00:00:00(星期日)| 1 |
| 1 |2023-10-08 00:00:00(星期日)| 1 |
| 1 |2023-10-15 00:00:00(星期日)| 1 |
| 1 |2023-10-22 00:00:00(星期日)| 1 |
| 1 |2023-10-29 00:00:00(星期日)| 1 |
那么PIVOT的输出是:
| 一|第1周|第2周|第三周|第4周|第五周|
| --|--|--|--|--|--|
| 1 | 1 | 1 | 1 | 1 | 0 |
fiddle

相关问题