如何在这个特定的 T-SQL 查询中使用 Table 变量?

How to use a Table Variable with this specific T-SQL query?

我正在使用 SQL Server 2012 并且我有以下 T-SQL 查询 运行 针对我的数据库中的 table。查询运行良好,但我的问题是我想获得几个特定日期的输出。而不是多次 运行 查询(通过每次更改 @Date 变量的值),我希望它将 @Date 值存储在某处并在我的查询中实现逻辑。我该怎么做?

我原来的Query如下:

DECLARE @Date date;
SET @Date = '20180630';

SELECT @Date, COUNT(*) AS Employees
FROM RavEmpID
WHERE DateOfEntry <= @Date
  AND (DateLeft > @Date
   OR  DateLeft IS NULL);

从下面的post on Whosebug (SQL Server store multiple values in sql variable),我了解到我需要一个Table变量来存储我需要的@Date值.

所以,我在我的数据库上创建了一个 Table 变量(称为 TableVariable)。 TableVariable table 只有一列名为 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]

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

您的加入基于

 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]

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

  • 将所有原始 WHERE 条件移动到 ON 子句中
  • 将日期 table 设为 第一个 table 在 LEFT JOIN 中,因为您想保留所有这些日期
  • 更改 ``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];

请注意,我还将 table 别名从任意字母更改为 table 名称的缩写。这使得查询更容易阅读。