Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在这个特定的T-SQL查询中使用表变量?_Sql_Sql Server_Tsql_Table Variable - Fatal编程技术网

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

如何在这个特定的T-SQL查询中使用表变量?,sql,sql-server,tsql,table-variable,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 DateOf

我使用的是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);
 Date
 2015-11-30
 2015-12-31
 2016-01-31
 2016-02-29
 ...
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]
我的新T-SQL现在如下所示:

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

SELECT @Date, COUNT(*) AS Employees
FROM RavEmpID
WHERE DateOfEntry <= @Date
  AND (DateLeft > @Date
   OR  DateLeft IS NULL);
 Date
 2015-11-30
 2015-12-31
 2016-01-31
 2016-02-29
 ...
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]
 a.DateLeft > b.[Date]
但是where子句是基于

 b.[Date] = a.[DateLeft]
 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子句中 使日期表成为左联接中的第一个表,因为您希望保留所有这些日期 更改``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];

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

我认为问题可能在于联接,因为TableVariable中可能没有任何日期与Ravenpid表中的DateLeft匹配。如果我删除连接,我该如何解决这个问题?它确实为TableVariable表中的每个日期提供了一个输出,但数字不正确。事实上,我需要它来提供TableVariable表中日期的员工总数。例如,对于日期2017-11-30,我需要尚未离开的员工总数。ie:他们的左日期>2017-11-30非常感谢!正是我需要的。我认为您需要将第一行中的b.[Date]更改为d.[Date]。