Sar*_*sam 0 sql sql-server case subquery sql-server-2008
如果使用带有子查询的select case语句将else语句改为单个查询,我需要更改以下过程...
if((select COUNT(*) from pseb.dbo.meterattributedetails where meterid=@meterid)=0)
select @emf=EMF from pseb.dbo.METERMASTER where MeterID=@meterid
else if((select COUNT(*) from pseb.dbo.meterattributedetails where meterid=@meterid and dateadd(day,1,@fromdate)<DateTime)>0)
select top 1 @emf=oldvalue from pseb.dbo.meterattributedetails where MeterID=@meterid and dateadd(day,1,@fromdate)<datetime order by DateTime
else
select top 1 @emf=newvalue from pseb.dbo.meterattributedetails where meterid=@meterid and DateTime<@fromdate order by DateTime desc
Run Code Online (Sandbox Code Playgroud)
meterattribute表结构如下:
AttributeID AttributeName Oldvalue newvalue DateTime meterid
1 EMF 2.00000 4.00000 2012-07-05 4756
1 EMF 4.00000 6.00000 2012-07-10 4756
1 EMF 6.00000 8.00000 2012-07-15 4756
1 EMF 8.00000 10.00000 2012-07-25 4756
Run Code Online (Sandbox Code Playgroud)
在该表中,datetime指的是emf更改日期,如果我的输入是'2012-07-17'意味着我必须获取该特定日期的新值,,,在7月15日至25日期间,emf值为8.00000.
我使用http://www.dpriver.com/pp/sqlformat.htm格式化您的代码- 迈克尔
IF( (SELECT Count(*)
FROM pseb.dbo.meterattributedetails
WHERE meterid = @meterid) = 0 )
SELECT @emf = emf
FROM pseb.dbo.metermaster
WHERE meterid = @meterid
ELSE IF( (SELECT Count(*)
FROM pseb.dbo.meterattributedetails
WHERE meterid = @meterid
AND Dateadd(day, 1, @fromdate) < datetime) > 0 )
SELECT TOP 1 @emf = oldvalue
FROM pseb.dbo.meterattributedetails
WHERE meterid = @meterid
AND Dateadd(day, 1, @fromdate) < datetime
ORDER BY datetime
ELSE
SELECT TOP 1 @emf = newvalue
FROM pseb.dbo.meterattributedetails
WHERE meterid = @meterid
AND datetime < @fromdate
ORDER BY datetime DESC
Run Code Online (Sandbox Code Playgroud)
@Michael - 感谢http://www.dpriver.com/pp/sqlformat.htm的链接.
试试这个(当然未经测试)
SELECT @emf = CASE
WHEN ( (SELECT Count(*)
FROM pseb.dbo.meterattributedetails
WHERE meterid = @meterid) = 0 ) THEN
(SELECT emf
FROM pseb.dbo.metermaster
WHERE meterid = @meterid)
WHEN ( (SELECT Count(*)
FROM pseb.dbo.meterattributedetails
WHERE meterid = @meterid
AND Dateadd(day, 1, @fromdate) < datetime) > 0 )
THEN (
SELECT
TOP 1 oldvalue
FROM
pseb.dbo.meterattributedetails
WHERE
meterid = @meterid
AND Dateadd(day, 1, @fromdate) < datetime
ORDER
BY datetime)
ELSE (SELECT TOP 1 newvalue
FROM pseb.dbo.meterattributedetails
WHERE meterid = @meterid
AND datetime < @fromdate
ORDER BY datetime DESC)
END
Run Code Online (Sandbox Code Playgroud)
@Saranya:如果这不起作用,请在http://sqlfiddle.com/上设置测试用例怎么样
祝好运!