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上出现错误,在需要数字字符的地方发现了非数字字符等。
期望执行查询
1条答案
按热度按时间mbzjlibv1#
您的代码似乎试图执行动态透视,计算当前日期和接下来29天内每个星期天出现的
B
值。您不需要动态轴心。只需过滤表以获取透视前的星期日,然后根据日期之前的星期日数量进行透视(在接下来的30天内,将始终有4个或5个星期日)。
您也不需要使用任何特定于语言的代码,因为您可以使用
TRUNC(date_value, 'IW')
来查找ISO周的开始(通常是周一午夜),然后周日是ISO周开始前的1天。TABLE
和DATE
是保留字,不能用作无引号的标识符。最好的做法是用一个更具描述性的名称来命名你的表和列,但是如果你必须使用TABLE
和DATE
(请不要使用),那么你需要在所有使用它们的地方使用带引号的标识符(和正确的大小写)。其中,对于样本数据:
它生成值:
| 一|日期|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