首页 > 解决方案 > 如何在这个特定的 T-SQL 查询中使用表变量?

问题描述

我正在使用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 在 sql 变量中存储多个值)的帖子中,我了解到我需要一个表变量来存储@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]

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

标签: sqlsql-servertsqltable-variable

解决方案


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

  • 将所有原始WHERE条件移入ON子句
  • 将日期表设为第一个表,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];

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


推荐阅读