我有以下查询:
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#中完成)。任何帮助,将不胜感激。感谢。
答案 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