SQL:如何在IF,THEN,Else SQL语句中正确使用关键字'BETWEEN'和聚合函数

时间:2014-05-27 20:25:32

标签: sql sql-server tsql if-statement aggregate

我有以下查询:

DECLARE @BeginDateQ1 date = '01-01-2010', @EndDateQ1 date = '12-31-2010'
BEGIN

SELECT 
   H.Type, H.SN, Sum(H.Hours), H.Date as 'Report Date', 
   H.OName, R.ReceivedDate, R.Confirmed, R.Part AS 'Part Number'
FROM 
   Hours H
INNER JOIN 
   Repair R ON H.SN = R.SN 
WHERE 
   (R.Confirmed NOT LIKE 'O%' AND R.Confirmed NOT LIKE 'Y%')
   AND (H.Date BETWEEN @BeginDateQ1 AND @EndDateQ1) 
GROUP BY 
   H.Type, H.SN, H.Date, H.OName, R.ReceivedDate, R.Confirmed, R.Part 
ORDER BY 
   Date ASC
END

这给了我想要的结果。

我遇到以下IF声明时遇到问题:

IF 
(SELECT R.ReceivedDate FROM Repair BETWEEN @BeginDate1 AND @EndDate1)
THEN
COUNT(R.Confirmed) 
END IF

另外,我如何在产生我想要的原始结果的原始查询中正确包含此IF语句?

注意,我需要将IF语句的计数结果用作等式的分母,分子是帖子中原始查询的第3行的SUM(小时)。

这是我第一次在SQL中编写IF语句(仅在C#中完成)。任何帮助,将不胜感激。感谢。

3 个答案:

答案 0 :(得分:2)

IF是一个控制流语句,不能在查询中使用。

IF (somecondition) THEN
  <sql statements>
ELSE
  <sql statements>
END

您可以在存储过程中执行此操作。要在查询中执行条件,您需要使用CASE ...

SELECT col1, col2,
   CASE when col1='x' then 'HIT' else 'MISS' END
from myTable

会给你一个包含三列的结果,在最后一列你会得到文字&#39; HIT&#39;或者&#39; MISS&#39;基于col1中的值。

答案 1 :(得分:2)

案例结构可能就是您所追求的。这样的事情。

, case when R.ReceivedDate  BETWEEN @BeginDate1 AND @EndDate1
then count(r.confirmed) else sum(0) end confirmations

编辑从这里开始

请注意,这个答案只显示了一般的想法。由于OP后面提到的结果是分母,别名必须消失。此外,sum(0)必须由代表sum(hours)的东西代替,无论可能是什么

答案 2 :(得分:0)

如果要查看查询是否返回任何行,请使用EXISTS()

IF EXISTS(SELECT R.ReceivedDate FROM Repair BETWEEN @BeginDate AND @EndDate)
BEGIN
 ... 
END