0

サブクエリで 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 
4

2 に答える 2

7

@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 

@Saranya: これでうまくいかない場合は、 http ://sqlfiddle.com/ でテスト ケースを設定してみてはいかがでしょうか。

幸運を!

于 2012-07-25T15:04:36.777 に答える
0

構文チェックを試みていないので、次のようなものを探していると思います。

select @emf = case
  when not exists ( select 42 from pseb.dbo.meterattributedetails where meterid = @meterid )
    then ( select emf from pseb.dbo.metermaster where meterid = @meterid )
  when exists ( select 42 from pseb.dbo.meterattributedetails where meterid = @meterid and
    Dateadd(day, 1, @fromdate) < datetime )
    then ( select top 1 oldvalue from pseb.dbo.meterattributedetails where meterid = @meterid and
      Dateadd(day, 1, @fromdate) < datetime order by datetime )
  else ( select 1 newvalue from pseb.dbo.meterattributedetails where meterid = @meterid and
    datetime < @fromdate order by datetime desc )
  end

編集:一般に、ゼロに対してチェックするカウントを取得している場合は、それを適切なEXISTSパフォーマンスに置き換えることができます。

于 2012-07-25T15:05:10.550 に答える