我想创建一个显示如下数据的查询
请注意,该数据用于考勤报告输入数据:
| 姓名|日期从|达托|地位|
| - ------|- ------|- ------|- ------|
| 安迪|二○二二年十一月一日|- -|1个|
| 贝丝|二○二二年十一月一日|二○二二年十一月三日|第二章|
| 凯西|二○二二年十一月一日|- -|1个|
| 安迪|二○二二年十一月二日|- -|1个|
| 凯西|二○二二年十一月二日|- -|1个|
...
| 姓名|一|二|...|三十一|共计|
| - ------|- ------|- ------|- ------|- ------|- ------|
| 安迪|是的|是的|...|十|八个|
| 贝丝|离开|离开|...|十|五个|
| 凯西|是的|是的|...|十|七|
(一个月内的总出勤率/“是”)
我的问题是有些月份有30天,有些有31天,甚至28/ 29天
我手动选择了数据,就像这样...
select user_fullname as usrname,
nvl(
max(CASE WHEN to_char(datefrom,'dd') = '01' and status = 1 THEN 'yes' else 'no' end END)
,'-') as "01",
等等...
我也试过
case when to_date('01-11-2022','dd-mm-yyyy')-to_date('01-12-2022','dd-mm-yyyy') = 30
then
nvl(
max(CASE WHEN to_char(datefrom,'dd') = '31' and status = 1 THEN 'yes' else 'no' end END)
,'-')
else 'X' end as "31",
但是它显示了一个无效日期错误,因为显然SQL验证了所有代码,即使它将被跳过(假设case语句将返回false)
有人能给予我一个解决这个问题的主意吗?
4条答案
按热度按时间4nkexdtk1#
从你的数据中,我了解到你想把X放在没有这些日期的月份中。
xjreopfe2#
c6ubokkw3#
更新日期:
结果:(您可以使用Where子句进行过滤,只获取一个用户和/或感兴趣的月份)
uhry853o4#
您可以生成日历并使用分区外联接到表,然后进行透视:
对于您的示例数据:
输出:
| 月份|姓名|1个|第二章|三个|四个|五个|第六章|七|八个|九|十个|十一|十二|十三|十四|十五|十六|十七个|十八|十九|二十个|二十一|二十二|二十三|二十四|二十五|二十六|二十七|二十八|二十九|三十|三十一|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 2022年11月1日|安迪|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个| * 无效 *|
| 2022年11月1日|贝丝|第二章|第二章|第二章|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个| * 无效 *|
| 2022年11月1日|凯西|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个|1个| * 无效 *|
CASE
表达式或DECODE
函数。*fiddle