SQL - 如何 return 每个月的每一天,即使没有可用数据
SQL - How to return every day of month even with no data available
下面是我的初始查询及其数据 returns:
SELECT
User
,Client
,Date
,Total
FROM SampleTable
WHERE Date BETWEEN '20200101' AND '20200131'
相反,我希望它在一个月中的每一天都包含一行,如下面的 table 所示:
我已经有了一个标准的 ANSI 日期 table;但是,我一直找不到包含还需要加入的维度的解决方案 (User/Client):
我不希望我的table看起来像这样:
我认为我的答案在交叉 apply/subquery 领域的某个地方,但我是 SQL 的新手,所以我无法准确理解如何完成。任何帮助,将不胜感激。谢谢!
如果 table 中包含所有日期,则可以将其用作来源。然后 cross join
和 left join
:
select uc.user, uc.client, d.date,
coalesce(st.total, 0)
from (select distinct user, client
from sampletable
) uc cross join
(select distinct date
from sampletable
) d left join
sampletable st
on st.user = uc.user and st.client = uc.client and
st.date = d.date;
如果基础 table 没有所有日期,您可以通过各种方式生成它们:
- 使用日历table。
- 使用递归 CTE。
- 生成一组数字并构建日期。
下面是我的初始查询及其数据 returns:
SELECT
User
,Client
,Date
,Total
FROM SampleTable
WHERE Date BETWEEN '20200101' AND '20200131'
相反,我希望它在一个月中的每一天都包含一行,如下面的 table 所示:
我已经有了一个标准的 ANSI 日期 table;但是,我一直找不到包含还需要加入的维度的解决方案 (User/Client):
我不希望我的table看起来像这样:
我认为我的答案在交叉 apply/subquery 领域的某个地方,但我是 SQL 的新手,所以我无法准确理解如何完成。任何帮助,将不胜感激。谢谢!
如果 table 中包含所有日期,则可以将其用作来源。然后 cross join
和 left join
:
select uc.user, uc.client, d.date,
coalesce(st.total, 0)
from (select distinct user, client
from sampletable
) uc cross join
(select distinct date
from sampletable
) d left join
sampletable st
on st.user = uc.user and st.client = uc.client and
st.date = d.date;
如果基础 table 没有所有日期,您可以通过各种方式生成它们:
- 使用日历table。
- 使用递归 CTE。
- 生成一组数字并构建日期。