我正在使用SQL Server 2012
,并且对数据库中的表运行以下T-SQL
查询。该查询运行正常,但是我的问题是我想获取几个特定日期的输出。我不希望多次运行查询(通过每次更改@Date
变量的值),而是希望将@Date
值存储在某个位置并在查询中实现逻辑。我该怎么办?
我原来的查询如下:
DECLARE @Date date;
SET @Date = '20180630';
SELECT @Date, COUNT(*) AS Employees
FROM RavEmpID
WHERE DateOfEntry <= @Date
AND (DateLeft > @Date
OR DateLeft IS NULL);
从下面关于StackOverflow
(SQL Server store multiple values in sql variable)的帖子中,我了解到我需要一个表变量来存储所需的@Date
值。
因此,我在数据库上创建了一个表变量(称为TableVariable
)。
TableVariable
表只有一个名为Date
的列,如下所示:
Date
2015-11-30
2015-12-31
2016-01-31
2016-02-29
...
我的新T-SQL
现在如下所示:
SELECT b.[Date], COUNT(*) AS Employees
FROM RavEmpID a
left join TableVariable b on b.[Date] = a.[DateLeft]
WHERE a.DateOfEntry <= b.[Date]
AND (a.DateLeft > b.[Date]
OR a.DateLeft IS NULL)
GROUP BY b.[Date]
运行此查询时,我的输出为零。我在这里做什么错了?
答案 0 :(得分:1)
您需要对查询进行一些更改:
WHERE
条件移至ON
子句LEFT JOIN
中的 first 表,因为您想保留所有这些日期结果查询:
SELECT d.[Date], COUNT(r.DateOfEntry) AS Employees
FROM TableVariable d LEFT JOIN
RavEmpID r
ON r.DateOfEntry <= d.[Date] AND
(r.DateLeft > d.[Date] OR r.DateLeft IS NULL)
GROUP BY d.[Date]
GROUP BY d.[Date];
请注意,我还将表别名从任意字母更改为表名称的缩写。这使查询更易于阅读。
答案 1 :(得分:0)
您的加入基于
b.[Date] = a.[DateLeft]
但是您的where子句基于
a.DateLeft > b.[Date]
因此没有逻辑来获取记录。 试试这个:
SELECT b.[Date], COUNT(*) AS Employees
FROM RavEmpID a
inner join TableVariable b on b.[Date] = a.[DateLeft]
WHERE a.DateOfEntry <= b.[Date]