Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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
具有日期范围的多选sql查询_Sql - Fatal编程技术网

具有日期范围的多选sql查询

具有日期范围的多选sql查询,sql,Sql,我有一个查询,我从一个员工花名册表中得到不同统计数据的总数 SELECT A.rempid AS EmpId, E.flname, A.rdo_total, B.grave_total, C.sundays, D.holidays FROM (SELECT rempid, Count(rshiftid)AS RDO_Total FROM rtmp1

我有一个查询,我从一个员工花名册表中得到不同统计数据的总数

SELECT A.rempid AS EmpId, 
       E.flname, 
       A.rdo_total, 
       B.grave_total, 
       C.sundays, 
       D.holidays 
FROM   (SELECT rempid, 
               Count(rshiftid)AS RDO_Total 
        FROM   rtmp1 
        WHERE  rshiftid = 2 
        GROUP  BY rempid 
        HAVING Count(rshiftid) > 0) A, 
       (SELECT rempid, 
               Count(rshiftid)AS Grave_Total 
        FROM   rtmp1 
        WHERE  rshiftid = 6 
        GROUP  BY rempid 
        HAVING Count(rshiftid) > 0)B, 
       (SELECT rempid, 
               Count(rshiftid) AS Sundays 
        FROM   rtmp1 
        WHERE  Datepart(dw, rdate) = 1 
               AND rshiftid > 2 
        GROUP  BY rempid 
        HAVING Count(rshiftid) > 0)C, 
       (SELECT rempid, 
               Count(rshiftid) AS Holidays 
        FROM   rtmp1 
        WHERE  rdate IN (SELECT pubhdt 
                         FROM   pubhol) 
               AND rshiftid > 2 
        GROUP  BY rempid 
        HAVING Count(rshiftid) > 0)D, 
       (SELECT empid, 
               [fname] + ' ' + [sname] AS flName 
        FROM   remp1)E 
WHERE  A.rempid = B.rempid 
       AND A.rempid = E.empid 
       AND A.rempid = C.rempid 
       AND A.rempid = D.rempid 
ORDER  BY A.rempid 

我想在其中添加一个日期范围,这样我可以在两个日期内查询数据库。rTmp1表有一个名为rDate的列。我想知道最好的方法是什么。我可以将其添加到存储过程中,并将变量添加到每个select查询中。或者是否有更好的方法在日期范围内运行查询。

我认为只需添加一个额外的where子句项,类似于:

AND ( rDate > somedate AND rDate < someotherdate )
和(rDate>somedate和rDate
将日期范围添加到每个查询是最直接的解决方案

将其设置为存储过程始终可以通过查询完成,但与此特定情况无关

如果将表缩小到指定的日期范围所产生的记录数大大少于整个表,则可以选择将这些记录插入该表/结果集中,并在该表/结果集中运行现有查询

<>虽然我没有任何数据要测试,但是您可以考虑下面的查询,因为它更容易阅读,并且可以更好地执行。但是你必须自己检查结果,也许还要做一些调整

DECLARE @startDate date = '12/01/2012'
DECLARE @endDate date = DATEADD(MONTH, 1, @startDate)

SELECT
  [e].[empid],
  [e].[fname] + ' ' + [e].[sname] AS [flName],
  SUM(CASE WHEN [t].[rshiftid] = 2 THEN 1 ELSE 0 END) AS [RDO_Total],
  SUM(CASE WHEN [t].[rshiftid] = 6 THEN 1 ELSE 0 END) AS [Grave_Total],
  SUM(CASE WHEN [t].[rshiftid] > 2 AND DATEPART(dw, [t].[rdate]) = 1 THEN 1 ELSE 0 END) AS [Sundays],
  SUM(CASE WHEN [t].[rshiftid] > 2 AND [h].[pubhdt] IS NOT NULL THEN 1 ELSE 0 END) AS [Holidays]
FROM [remp1] [e]
INNER JOIN [rtmp1] [t] ON [e].[empid] = [t].[rempid]
LEFT JOIN [pubhol] [h] ON [t].[rdate] = [h].[pubhdt]
WHERE [t].[rdate] BETWEEN @startDate AND @endDate
GROUP BY 
  [e].[empid],
  [e].[fname],
  [e].[sname]
ORDER BY [empid] ASC

我可以将其添加到存储过程中,并将变量添加到每个select查询中
-是的,您当然可以@阿尔法辛不是很有建设性,是吗?@Jacco为什么不是?这是个不错的选择!顺便说一句,创建临时表在我听来像是杀戮过度,除非他需要再次设置相同的结果。@alfan对于误解您的评论,我深表歉意。我认为这是讽刺,因为我不知道sp如何改进解决方案。我的临时表建议来自这样一个事实:他正在查询表rtmp1 4次,并且他需要所有4次查询的日期范围。
somedate
someotherdate
是动态的!我打算把它变成变量。。。所以我可能应该添加@somedate和@someotherdate-重点是您只需要一个附加的and条件-而不是每个子选择中都有一个。谢谢Jacco,这正是我想要的,它还显示了值为0的员工,这也是我的查询中的一个问题。@AJ188很高兴回答了您的问题。感谢您将其标记为(首选)解决方案。现在继续回到原来的状态!;-)