SQL-如何即使没有可用数据也要每月返回

问题描述

以下是我的初始查询及其返回的数据:

SELECT
    User,Client,Date,Total
FROM SampleTable 
WHERE Date BETWEEN '20200101' AND '20200131'

InititalQueryResult

相反,我希望该月的每一天都包含一行,如下表所示:

IntendedQueryResult

我已经有一个标准的ANSI日期表;但是,我一直无法找到一个解决方案,其中包含还需要在(用户/客户端)上进行连接的维度:

希望我的桌子看起来像这样:

UnintendedQueryResult

我想我的答案在交叉应用/子查询领域中,但是对于sql来说是新手,所以我很难确切地知道将如何完成。任何帮助,将不胜感激。谢谢!

解决方法

如果表格中有所有日期,则可以将其用作来源。然后是cross joinleft 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。
  • 生成一堆数字并构造日期。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...