SQL左连接过滤不匹配的记录(缺少null)

时间:2014-12-01 20:48:47

标签: sql-server sql-server-2005

我有两张桌子。

  1. 日历:此表包含一年的日期。
  2. 访客表:此表包含日期和访问人数。
  3. 在访客表中几天没有记录。

    发行日期范围为2014年8月22日至2014年9月30日。

    日期以下列格式存储

    '2014-08-21 00:00:00.000'和'2014-10-17 00:00:00.000'

    在使用VisitorTable的Calendar表的左连接上,我没有获得给定日期范围的空值。结果如下所示

    SQL查询

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

    输出

    ActivityDate访问
    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'
    

    输出

    DATE
    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,因此我需要没有vistis的日期。

    指针会有所帮助。

    提前致谢。

3 个答案:

答案 0 :(得分:1)

您的WHERE子句强制隐式INNER JOIN。您需要处理NULL子句中的WHERE值,或将您的条件指定为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

答案 1 :(得分:0)

使用左连接,左表中的所有内容以及右表中匹配的任何内容。

您的要求如下,您需要完全加入或尝试交换联接。

答案 2 :(得分:0)

最终查询

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;