2017-08-29 6 views
1
RES as 
(
SELECT code , payement, 
sum(A.ALLPAYMENT) as ACTUAL_PAYMENT, 
A.NAME 
FROM FINANCES A 
WHERE payement= '6396' 
and (ENDDATE>= CURRENT_TIMESTAMP) 
and (BILLREFRENCE<> '' or 

(case when ( CONVERT (int, (select BILLTIME from MYCALENDAR CL 
           where CL.code = A.code and CL.NAME= 
A.NAME 
          ) 
         ) 
       > CONVERT (INT, REPLACE(CONVERT(VARCHAR(8), GETDATE(), 108), 
       ':', '')) 
      ) then LEVEL in ('300', '100', '404') 
       else 
       LEVEL in ('300','404') 
) 


) 
GROUP BY code, payement, A.NAME) 
OR条件のいずれか( '300' または 「OR LEVEL "OR LEVEL( '300'、 '100'、 '404')に" する必要があります

内部または内側とでは、 ( '300'、 '100'、 '404')の場合は、の現在のシステム時間がBILLTIMEより大きい場合( '300'、 '404')、レベルが '300'、 '100'、 '404'の場合CASE文のSQL

PS:BILLTIMEは軍事的な時間 "130000"の形式になっているため、変換が行われます。

+3

ドン」 'where'節で' case'を使います。単純ブール論理で書き直すことができます。 –

+0

CASEは文の一部ではなく、条件付きの 'EXPRESSION'です(Cの3項式と同じように) – joop

答えて

1

WHERE句の式の結果はブール値なので、CASE式を使用せずに常にブール式として書き換えることができます。場合によっては、ロジックを簡素化することもできます。

最初のケースからINリストは一つだけメンバー、'100'により、第2の場合にはINリストとは異なりますので、あなたはCASE式の中INリストを避けるために、あなたの状態を再構築することができます

SELECT 
    ... 
WHERE LEVEL in ('300','404') 
    OR LEVEL = '100' AND CONVERT(...) > CONVERT(...) 
+0

duh!これはうまくいかなかった。どうもありがとうございました :) –