LEFT JOIN不显示COUNT的天数为零

时间:2019-11-08 09:35:28

标签: sql teradata

我正在尝试检索最近X天的数据,并计算每天的新行。我还需要获得COUNT = 0的日子。

我现在的查询是:

SELECT COUNT(*), CAST(TIMESTAMP_T AS DATE) 
FROM TABLE_A a 
LEFT OUTER JOIN
     (SELECT CAST(CALENDAR_DATE AS DATE) as DATE0 
      FROM   SYS_CALENDAR.CALENDAR) b 
ON       CAST(a.TIMESTAMP_T AS DATE)  =  b.DATE0 
WHERE    b.DATE0 BETWEEN CURRENT_DATE - INTERVAL '7' DAY AND CURRENT_DATE 
GROUP BY CAST(a.TIMESTAMP_T AS DATE) 
ORDER BY CAST(a.TIMESTAMP_T AS DATE) DESC

它返回以下内容:

255 2019-11-07
922 2019-11-06
342 2019-11-05
176 2019-11-04
18  2019-11-02
224 2019-11-01

如您所见,查询没有显示几天。

4 个答案:

答案 0 :(得分:2)

改为使用RIGHT OUTER JOIN,以包括那些日子:

SELECT COUNT(a.TIMESTAMP_T), b.DATE0
FROM TABLE_A a
   RIGHT OUTER JOIN(SELECT CAST(CALENDAR_DATE AS DATE) as DATE0 FROM SYS_CALENDAR.CALENDAR) b ON CAST(a.TIMESTAMP_T AS DATE)=b.DATE0
WHERE b.DATE0 BETWEEN CURRENT_DATE - INTERVAL '7' DAY AND CURRENT_DATE
GROUP BY b.DATE0
ORDER BY b.DATE DESC

由于您想要所有日历日,即使没有任何TABLE_A行的日历日。

COUNT()的table_a列,以在不存在的table_a天中获得0。 (COUNT(*)将返回1 ...)

答案 1 :(得分:1)

您应该能够像这样简化它:

SELECT COUNT(a.TIMESTAMP_T), b.CALENDAR_DATE
FROM SYS_CALENDAR.CALENDAR b
LEFT JOIN TABLE_A a ON CAST(a.TIMESTAMP_T AS DATE) = b.CALENDAR_DATE
WHERE b.CALENDAR_DATE BETWEEN CURRENT_DATE - INTERVAL '7' DAY AND CURRENT_DATE 
GROUP BY b.CALENDAR_DATE
ORDER BY b.CALENDAR_DATE DESC

一些注意事项:

  • calendar_date视图中的sys_calendar.calendar字段为DATE,无需强制转换
  • Teradata可让您引用别名列,而无需执行外部SELECT
  • COUNT(*)替换为COUNT(a.TIMESTAMP_T),以获得更准确的计数(感谢jarlh)

答案 2 :(得分:0)

由于日历表中的数据会更多

,所以可以互换外部联接或反向联接表

答案 3 :(得分:0)

请您详细说明一下吗?表A仅在有条目时才有日期。假设,我有类似的要求:

选择temp1.qwer,count(temp1.DATDAY) 来自( 选择*从 (SELECT TRUNC(SYSDATE,'MM')+ LEVEL-1 AS qwer 从双t 通过TRUNC连接(TRUNC(SYSDATE,'MM')+ LEVEL-1,'MM')= TRUNC(SYSDATE,'MM'))temp 左联接 temp.qwer = t1.DATDAY上的Temp1_check t1) 按temp1.qwer分组 按temp1.qwer排序;

此查询将生成当月的条目列表,并计算在Temp1_check上进行的条目数量。

Temp1_Check with具有日期列表及其各自的条目。例如:如果11月9日进行10次尝试,则11月9日将与条目的其他详细信息重复。希望这可以帮助。如果您能详细说明,我可以帮助您实现您的要求。

谢谢。