如何在此特定的T-SQL查询中使用表变量?

时间:2018-08-19 06:06:54

标签: sql sql-server tsql table-variable

我正在使用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);

从下面关于StackOverflowSQL 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]

运行此查询时,我的输出为零。我在这里做什么错了?

2 个答案:

答案 0 :(得分:1)

您需要对查询进行一些更改:

  • 将所有原始WHERE条件移至ON子句
  • 将日期表设为LEFT JOIN中的 first 表,因为您想保留所有这些日期
  • 更改``COUNT()`以计算匹配项

结果查询:

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]