sql - 当oracle中特定周不存在数据时如何将值填充为零
问题描述
我有一个具有以下结构的表。
Note_title varchar2(100)
Note_created_on date
现在在报告中,我想显示每周创建的所有笔记,因此我为它实施了以下解决方案。
SELECT to_char(Note_created_on - 7/24,'ww')||'/'||to_char(Note_created_on - 7/24,'yyyy') as Week ,
nvl(COUNT(Note_title),'0') as AMOUNT
FROM Notes
GROUP BY to_char(Note_created_on - 7/24,'ww') ,
to_char(Note_created_on -7/24,'yyyy')
ORDER BY to_char(Note_created_on - 7/24,'ww') DESC
而且我从中得到了正确的输出,但是假设第 42,45 周没有任何已创建的注释,那么它只是缺少它。样本输出:
WEEK AMOUNT
46/2018 3
44/2018 22
43/2018 45
41/2018 1
40/2018 2
39/2018 27
38/2018 23
那么我怎样才能获得第 42,45 周的零值而不是将它们排除在外呢?
解决方案
首先,您需要生成每年之间的所有周数,然后在周数上与 Notes 表连接,并按生成的周数分组。例如:
with weeks
as ( select level as lvl /*Assume 52 weeks in a calendar year..*/
from dual
connect by level <=52
)
,weeks_year
as (select distinct
b.lvl||'/'||trunc(Note_created_on,'YYYY') as week_year_val /*From the start of year in Note_created_on*/
from Notes a
join weeks b
on 1=1
)
SELECT a.week_year_val as Week
,COUNT(Note_title) as AMOUNT
FROM weeks_year a
LEFT JOIN Notes b
ON a.week_year_val=to_char(b.Note_created_on - 7/24,'ww')||'/'||to_char(b.Note_created_on - 7/24,'yyyy')
GROUP BY a.week_year_val
ORDER BY a.week_year_val DESC
推荐阅读
- java - 使用带有 ImageView 和 TextView 的 ScrollView 移动我的布局标记
- angular - 有没有办法在外部变量中检索承诺或可观察的值?
- java - @DiscriminatorColumn 的动态值
- css - 保持图像纵横比,同时适合没有容器或空白的尺寸
- php - 电报内联键盘 PHP
- visual-studio - 创建包含 UWP 应用和 Windows 服务的 MSIX 包
- android - 如何在 Dart 中将字节数组转换为 cp874?
- bash - 如何在bash脚本中的特定单词后添加逗号?
- html - align-items-center 不适用于 Ionic4
- f# - Giraffe 和 AspNetCore.Identity:打开二进制文件时出错