【问题标题】:SQL left join filters the unmatching records (missing null)SQL左连接过滤不匹配的记录(缺少null)
【发布时间】:2014-12-01 20:48:47
【问题描述】:

我有两张桌子。

  1. 日历:此表包含一年的日期。
  2. VisitorTable :此表包含访问的日期和人数。

在访问者表中几天没有记录。

有问题的日期范围是 2014 年 8 月 22 日至 2014 年 9 月 30 日。

日期以以下格式存储

“2014-08-21 00:00:00.000”和“2014-10-17 00:00:00.000”

在日历表与 VisitorTable 的左连接中,我没有得到给定日期范围的空值。结果如下所示

SQL 查询

SELECT VisitingDate ActivityDate
,COUNT(Visit) AS Visits  
FROM CALENDAR A
  LEFT JOIN VisitorTable b
ON B.VisitingDate= A.[DATE]
  WHERE b.StoreName = 'ABC'

输出

活动日期访问次数
2014-10-16 00:00:00.000 63
2014-09-30 00:00:00.000 69
2014-08-22 00:00:00.000 51

日历表

SELECT *
FROM CALENDAR A
WHERE A.[DATE] BETWEEN '2014-08-22 00:00:00.000'
        AND '2014-09-30 00:00:00.000'

输出

日期
2014-08-22 00:00:00.000
2014-08-23 00:00:00.000
2014-08-24 00:00:00.000
2014-08-25 00:00:00.000
2014-08-26 00:00:00.000
2014-08-27 00:00:00.000 .
.
.
2014-09-28 00:00:00.000
2014-09-29 00:00:00.000
2014-09-30 00:00:00.000

我正在绘制一个 grpah,因此我需要零访问的日期。

指针会有所帮助。

提前致谢。

【问题讨论】:

    标签: sql-server sql-server-2005


    【解决方案1】:

    您的WHERE 子句强制使用隐式INNER JOIN。您需要在WHERE 子句中处理NULL 值或将您的条件指定为LEFT JOIN 的一部分。

    试试:

    SELECT VisitingDate ActivityDate
        ,COUNT(Visit) AS Visits  
    FROM CALENDAR A
    LEFT JOIN VisitorTable b
        ON B.VisitingDate= A.[DATE]
        AND b.StoreName = 'ABC'
    GROUP BY VisitingDate
    

    或者:

    SELECT VisitingDate ActivityDate
        ,COUNT(Visit) AS Visits  
    FROM CALENDAR A
    LEFT JOIN VisitorTable b
        ON B.VisitingDate= A.[DATE]
    WHERE b.StoreName = 'ABC'
        OR b.StoreName IS NULL
    GROUP BY VisitingDate
    

    【讨论】:

    • 你的 where 子句过滤器帮助了我。查询是正确的,但我选择的列是错误的。 SELECT C.[DATE] VisitingDate ActivityDate ,COUNT(Visit) AS Visits FROM CALENDAR A LEFT JOIN VisitorTable b ON B.VisitingDate= A.[DATE] AND b.StoreName = 'ABC'
    【解决方案2】:

    使用左连接,您将获得左表中的所有内容以及右表中匹配的所有内容。

    您的要求看起来像,您需要完全加入或尝试交换加入。

    【讨论】:

    • 由于我从同一个表 B 中选择了两列,我无法验证数据并忽略空值。包括表 A 中的日期并且它有效。
    【解决方案3】:

    最终查询

    WITH Gross_Visitor
    AS (
        SELECT *
        FROM dbo.VisitorTable a
        WHERE a.StoreName = 'ABC'
            AND A.ActivityDate BETWEEN '2014-08-22 00:00:00.000'
                AND '2014-10-20 00:00:00.000'
        )
    SELECT *
    FROM (
        SELECT C.DATE ActivityDate
            ,COUNT(Visit) AS Visits  
        FROM CALENDAR C
        LEFT JOIN Gross_Visitor O
            ON O.ActivityDate = C.[DATE]
        ) X
        WHERE X.ActivityDate BETWEEN '2014-08-22 00:00:00.000'
                AND '2014-10-20 00:00:00.000'
    ORDER BY X.ActivityDate desc;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多