问题描述
以下是我的初始查询及其返回的数据:
SELECT
User,Client,Date,Total
FROM SampleTable
WHERE Date BETWEEN '20200101' AND '20200131'
相反,我希望该月的每一天都包含一行,如下表所示:
我已经有一个标准的ANSI日期表;但是,我一直无法找到一个解决方案,其中包含还需要在(用户/客户端)上进行连接的维度:
我 不 希望我的桌子看起来像这样:
我想我的答案在交叉应用/子查询领域中,但是对于sql来说是新手,所以我很难确切地知道将如何完成。任何帮助,将不胜感激。谢谢!
解决方法
如果表格中有所有日期,则可以将其用作来源。然后是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;
如果基本表没有全部日期,则可以通过多种方式生成日期:
- 使用日历表。
- 使用递归CTE。
- 生成一堆数字并构造日期。