サブクエリで select case ステートメントを使用して、次の手順 if 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
次のような 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
そのテーブルでは、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