我有两张桌子。
在访客表中几天没有记录。
发行日期范围为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的日期。
指针会有所帮助。
提前致谢。
答案 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;