2016-07-07 103 views
3

我的SELECT查询都在下面工作,并将返回值作为两个单独的结果。我想要做的是,如果第一个SELECT语句返回一个0,并且有时候是由于我们工作的性质,我希望第二个SELECT语句忽略第一个返回零,如果可能的话。如果第一个返回大于零的结果,那么我不希望第二个运行。SQL - 如果计数结果= 0,则运行第二个查询

我一直在寻找和尝试不同的IF ELSE等,但由于使用的具体日期/时间公式,我认为这可能是不可能的,或者我可能不得不重写。这是有目的的,但我不会让你生气。提前致谢!

Declare @StartDate as DateTime 
Declare @EndDate as DateTime 
Declare @TodaysDate as DateTime 
Declare @Previous as DateTime 
Declare @Previous2 as DateTime 

set @TodaysDate = GETDATE() 
set @Previous = DATEADD(day,-1,@TodaysDate) 
set @Previous2 = DATEADD(day,-2,@TodaysDate) 

-- SELECT Statetment one starts here 

set @StartDate = cast(convert(varchar(4), datepart(yyyy, getdate())) + '-' + 
convert(varchar(2), datepart(mm, @Previous)) + '-' + 
convert(varchar(2), datepart(dd, @Previous)) + ' ' + 
'05:00' as datetime) 
set @EndDate = cast(convert(varchar(4), datepart(yyyy, getdate())) + '-' + 
convert(varchar(2), datepart(mm, @Previous)) + '-' + 
convert(varchar(2), datepart(dd, @Previous)) + ' ' + 
'16:59' as datetime) 

SELECT Count(*) as FirstShfitPrevious 
FROM [TOL_PROD_DB].[dbo].[tblLOT_CTRL_Active_Component] 
WHERE Close_Time_Stamp between @StartDate and @EndDate 

-- Query 2 Starts, Declarations already made at beginning 

set @StartDate = cast(convert(varchar(4), datepart(yyyy, getdate())) + '-' + 
convert(varchar(2), datepart(mm, @Previous2)) + '-' + 
convert(varchar(2), datepart(dd, @Previous2)) + ' ' + 
'05:00' as datetime) 
set @EndDate = cast(convert(varchar(4), datepart(yyyy, getdate())) + '-' + 
convert(varchar(2), datepart(mm, @Previous2)) + '-' + 
convert(varchar(2), datepart(dd, @Previous2)) + ' ' + 
'16:59' as datetime) 

SELECT Count(*) as FirstShfitPrevious2 
FROM [TOL_PROD_DB].[dbo].[tblLOT_CTRL_Active_Component] 
WHERE Close_Time_Stamp between @StartDate and @EndDate 
+0

难道你不是我们一个简单的'如果'结构? – FDavidov

回答

0

你可以试试你的第一个查询结果的值存储在一个变量,然后再检查值一样

declare @myVar int 

SELECT @myVar = Count(*) as FirstShfitPrevious 
FROM [TOL_PROD_DB].[dbo].[tblLOT_CTRL_Active_Component] 
WHERE Close_Time_Stamp between @StartDate and @EndDate) 

if(@myVar = 0) 
//Here your second query logic 
begin 
set @StartDate = cast(convert(varchar(4), datepart(yyyy, getdate())) + '-' + 
convert(varchar(2), datepart(mm, @Previous2)) + '-' + 
convert(varchar(2), datepart(dd, @Previous2)) + ' ' + 
'05:00' as datetime) 
set @EndDate = cast(convert(varchar(4), datepart(yyyy, getdate())) + '-' + 
convert(varchar(2), datepart(mm, @Previous2)) + '-' + 
convert(varchar(2), datepart(dd, @Previous2)) + ' ' + 
'16:59' as datetime) 

SELECT Count(*) as FirstShfitPrevious2 
FROM [TOL_PROD_DB].[dbo].[tblLOT_CTRL_Active_Component] 
WHERE Close_Time_Stamp between @StartDate and @EndDate 
end 
+0

或更好 - “select @myVar = count(*)...' –

+1

@ZoharPeled: - 是的,更新了! –

+0

我以前尝试过,但问题是标记为“As”,所以语句失败。如果我取出FirstShiftPrevious,它将运行,但您只会收到一条消息,表示wuery成功运行且没有返回的数据。 – Edward

0

使用NOT EXISTS ..

if NOT Exists 
(Select 1 as FirstShfitPrevious--first query 
FROM [TOL_PROD_DB].[dbo].[tblLOT_CTRL_Active_Component] 
WHERE Close_Time_Stamp between @StartDate and @EndDate 
) 
Begin 
SELECT Count(*) as FirstShfitPrevious2--second query 
FROM [TOL_PROD_DB].[dbo].[tblLOT_CTRL_Active_Component] 
WHERE Close_Time_Stamp between @StartDate and @EndDate 
END 
Else 
Begin 
--First query 
End 
+0

班结束了,所以我会明天再来看看这个。看起来很有希望。 – Edward

0

甚至这种方式:

SELECT TOP 1 Count(*) as FirstShfitPrevious2 
FROM [TOL_PROD_DB].[dbo].[tblLOT_CTRL_Active_Component] 
WHERE Close_Time_Stamp between @StartDate and @EndDate 
GROUP BY CAST(Close_Time_Stamp AS DATE) 
ORDER BY CAST(Close_Time_Stamp AS DATE) DESC 

与牙周d涵盖两个日期范围。

+0

我试过这个,我感谢你的输入,但结果与我原来的查询一样,我得到了相同的结果。我想消除的第一个结果,甚至不显示,如果在0 – Edward

+0

恐怕这是不可能的(如果这是完整的来源)。你不能在groups_中找到count(*)= 0。如果没有行符合条件,就会有_no group_。注:_ **期间涵盖两个日期范围** _。 '@startdate' - 最低的一个 - 'dateadd(-2)' –

+1

所以这些建议都不起作用,我再次感谢你。我看到日期fudegery正在进行的问题和整个零事情。我认为在目前的状态下做我所要求的是不可能的。要尝试和研究同事设置的这个“WHILE”事情,看看我是否无法获得数据来做我想做的事。 ITHANKS再次为您在Stack上的所有努力! – Edward

相关问题