2017-12-21 47 views
-1

条件のセットに対してPayrollOIDが必要な2つのテーブルの間にクロスジョインがあります。私はCASEステートメント、WHERE句のCASEとIIFステートメントでこれをやろうとしましたが、通常のコードでは空きを取り除くために別のパスを実行する必要があります。SQL> =および<= IIFまたはWHEREエラーが発生する

私は、承認日に基づいて給与計算に行く仕事の承認を持っています。承認が入力された日に変更しています。 Apr_Enteredは> = JobPayStartとApr_Entered < = TimesheetsDueとJobEndDate> = JobPayStartとJobEndDate < = JobPayEndある場合

- OIDことを私に与えます。他に何も見ないでください。

他 - 私は、Apr_EnteredがJobPayStart以上で、Apr_Enteredが= JobPayEndであるところで、仕事を支払うとします。

エラーが発生しました:関数の引数のリストでエラーが発生しました: '>'は認識されません。クエリテキストを解析できません。

しかし、実行されます。私はしかし、両方の括弧がオーバーラップジョブのために表示されている重複を取得しています。

私のブックエンドを緊張させる助けが必要です。私はまた、なぜ私はまだ私は日付のフィールドを比較するためにdatetimeフィールドを変換したときにエラーを取得しているかを知る必要があります。

IIF(CONVERT(varchar(10), ProtoPayroll.AprEntered,110) >= CONVERT(varchar(10), PayDates.PayStartDate,110) 
AND CONVERT(varchar(10), ProtoPayroll.AprEntered,110) <= CONVERT(varchar(10), PayDates.TimesheetsDue,110) 
AND CONVERT(varchar(10), ProtoPayroll.JobEndDate,110) >= CONVERT(varchar(10), PayDates.PayStartDate,110) 
AND CONVERT(varchar(10), ProtoPayroll.JobEndDate,110) <= CONVERT(varchar(10), PayDates.PayEndDate,110), 
    --First IIF's result 
    CONVERT(nvarchar(40), dbo.Paydates.OID), 
    --Now another IIF 
    IIF (CONVERT(varchar(10), ProtoPayroll.AprEntered,110) >= CONVERT(varchar(10), PayDates.PayStartDate,110) 
    AND CONVERT(varchar(10), ProtoPayroll.AprEntered,110) <= CONVERT(varchar(10), PayDates.PayEndDate,110), 
    --Second IIF's results 
    CONVERT(nvarchar(40), dbo.Paydates.OID), SPACE(40))) AS PayrollOID 
+2

なぜあなたは 'varchar'にあなたの日付を(私は推測)に変換されているを見ていますか? – Larnu

+0

問題を再現するスクリプトを投稿できない限り、誰もこの質問に確実に答えられるとは思えません。 –

答えて

0

あり推測作業の多くはここですが、SQLはきちんとを必要としていること。私はあなたのSQLに何か間違っているとは見えませんが、 "per-say"しかし、あなたはvarcharに日付を入れてトラブルを求めています。例として、varcharの日付'11/11/2016'です。01/01/2018'はい、そうです。これは、1> 0(varcharの最初の文字が最初にソートされ、次に2番目にソートされるなど)ためです。

とにかく、代わりにCASE式を使用して、あなたのSQLのより洗練されたバージョンです。明らかにこれは完全にテストされていません。実際に行う必要があるのは、サンプルデータ、DDL、および期待される結果セットを投稿することです。あなたは実際にここで質問することはありません、あなたはあなたの目標を教えて、エラーを得ることを言うだけです(私たちは複製できません)。

SELECT CASE WHEN PP.AprEntered >= PD.PayStartDate 
      AND PP.AprEntered <= PD.TimesheetsDue 
      AND PP.JobEndDate >= PD.PayStartDate 
      AND PP.JobEndDate <= PD.PayEndDate THEN CONVERT(nvarchar(40), PD.OID) 
      WHEN PP.AprEntered >= PD.PayStartDate 
      AND PP.AprEntered <= PD.PayEndDate THEN CONVERT(nvarchar(40), PD.OID) 
      ELSE SPACE(40) 
     END AS YourColumn 
FROM ProtoPayroll PP 
    JOIN PayDates PD ON --JOIN Criteria 
WHERE ...; 

これは参考になりましではない場合は、How to ask

+0

これは有効なCASE構文ではありません。 –

+0

@TabAllemanはい、あなたは正しいですが、それが間違っている理由を述べることも役立ちます。 「これは間違っている」というだけではありません。私はこの問題を解決しました。これは初期の「WHEN」の欠落です。 – Larnu

+0

ネストされたCASE式を使用するかどうかわからないため、何が間違っているのか正確には分かりませんでした。 –

関連する問題