2017-08-14 30 views
1

2つの日付間の差異(MaturityDate、PaymentDate)が1か月を超えている場合に1を返すステートメントにしたい場合。 満期日は、クライアントが支払を行うべき支払期日です。サブクエリが2つ以上の値を返しました。

私が試した:

CASE WHEN DATEDIFF(MONTH, 
      (SELECT Date FROM dim.RepaymentSchedule rs JOIN dim.Calendar cal ON cal.DateID = rs.MaturityDateID), 
      (SELECT Date FROM dim.RepaymentSchedule rs JOIN dim.Calendar cal ON cal.DateID = rs.PaymentDateID)) 
       BETWEEN 1 AND 2 THEN 1 ELSE 0 END AS OneMonthDelay 

CASE WHEN DATEDIFF(MONTH, 2017-06-30, 2017-08-01) BETWEEN 1 AND 2 THEN 1 ELSE 0 END AS OneMonthDelay 

に類似体である、生憎の復帰

サブクエリは複数の値を返しました。 サブクエリが、=、!<、< =、>、> =、またはサブクエリが式 として使用されている場合は、これは許可されません。

ご協力いただければ幸いです。

EDIT:全クエリ

SELECT 
    pt.ProductType 
    ,sr.SalesRegionName 
    ,ca.CreditAdvisorID 
    ,cal.CalendarYearMonth 
    ,CASE WHEN DATEDIFF(MONTH, 
     (SELECT Date FROM dim.RepaymentSchedule rs JOIN dim.Calendar cal ON cal.DateID = rs.MaturityDateID), 
     (SELECT Date FROM dim.RepaymentSchedule rs JOIN dim.Calendar cal ON cal.DateID = rs.PaymentDateID)) 
      BETWEEN 1 AND 2 THEN 1 ELSE 0 END AS OneMonthDelay -- >1 <2 not =>1 =<2 
    ,CASE WHEN DATEDIFF(MONTH, 
     (SELECT Date FROM dim.RepaymentSchedule rs JOIN dim.Calendar cal ON cal.DateID = rs.MaturityDateID), 
     (SELECT Date FROM dim.RepaymentSchedule rs JOIN dim.Calendar cal ON cal.DateID = rs.PaymentDateID)) 
      BETWEEN 2 AND 3 THEN 1 ELSE 0 END AS TwoMonthsDelay 
    ,RANK() OVER (PARTITION BY c.ApplicationID ORDER BY rs.RepaymentNumber, rs.Amount) AS RankID 
INTO #Frauds 
FROM  
    dim.Contract c 
    JOIN dim.Application a   ON c.ApplicationID = a.ApplicationID 
    JOIN dim.Calendar cal   ON a.ApplicationDateID = cal.DateId 
    JOIN dim.CreditAdvisor ca  ON a.OriginalCreditAdvisorID = ca.CreditAdvisorId 
    JOIN dim.SalesRegion sr   ON ca.SalesRegionID = sr.SalesRegionId 
    JOIN dim.ProductType pt   ON a.ProductTypeID = pt.ProductTypeID 
    JOIN dim.RepaymentSchedule rs ON c.ContractID = rs.ContractID 
WHERE 
    ((cal.CalendarYear >= @YearId) AND (rs.MaturityDateID < @DateId)) -- Since given year to this date 
    AND ((rs.PaymentDateID = 19000101) OR (rs.PaymentDateID > rs.MaturityDateID)) 
    AND rs.Amount <> 0 
+1

エラーはかなり明確です。あなたは全体の質問を投稿できますか? – HoneyBadger

+1

相関サブクエリまたは結合を使用します。 – jarlh

+0

@HoneyBadgerクエリ全体に対して編集されます。 –

答えて

0

はあなたのcase文に合流削除してみむしろ以下のすべての他の表とカレンダーテーブルに参加することはできますか?

SELECT 
    pt.ProductType 
    ,sr.SalesRegionName 
    ,ca.CreditAdvisorID 
    ,cal.CalendarYearMonth 
    ,CASE WHEN DATEDIFF(MONTH, 
     cal.DATE, 
     cal1.DATE) 
      BETWEEN 1 AND 2 THEN 1 ELSE 0 END AS OneMonthDelay -- >1 <2 not =>1 =<2 
    ,CASE WHEN DATEDIFF(MONTH, 
     CASE WHEN DATEDIFF(MONTH, 
     cal.DATE, 
     cal1.DATE) 
      BETWEEN 2 AND 3 THEN 1 ELSE 0 END AS TwoMonthsDelay 
    ,RANK() OVER (PARTITION BY c.ApplicationID ORDER BY rs.RepaymentNumber, rs.Amount) AS RankID 
INTO #Frauds 
FROM  
    dim.Contract c 
    JOIN dim.Application a   ON c.ApplicationID = a.ApplicationID 
    JOIN dim.Calendar cal   ON a.ApplicationDateID = cal.DateId 
    JOIN dim.CreditAdvisor ca  ON a.OriginalCreditAdvisorID = ca.CreditAdvisorId 
    JOIN dim.SalesRegion sr   ON ca.SalesRegionID = sr.SalesRegionId 
    JOIN dim.ProductType pt   ON a.ProductTypeID = pt.ProductTypeID 
    JOIN dim.RepaymentSchedule rs ON c.ContractID = rs.ContractID 
    JOIN dim.Calender cal1 ON rs.MaturityDateID = cal1.DATEID 
    JOIN dim.Calender cal2 ON rs.PaymentDateID = cal2.DATEID 
WHERE 
    ((cal.CalendarYear >= @YearId) AND (rs.MaturityDateID < @DateId)) -- Since given year to this date 
    AND ((rs.PaymentDateID = 19000101) OR (rs.PaymentDateID > rs.MaturityDateID)) 
    AND rs.Amount <> 0 
0

FROMにカレンダーテーブルを置くことが最も理にかなっているようだが、あなたの問題は、サブクエリでrsテーブルの繰り返しです。試してみることができます:

,CASE WHEN DATEDIFF(MONTH, 
    (SELECT Date FROM dim.Calendar cal WHERE cal.DateID = rs.MaturityDateID), 
    (SELECT Date FROM dim.Calendar cal WHERE cal.DateID = rs.PaymentDateID)) 
     BETWEEN 1 AND 2 THEN 1 ELSE 0 END AS OneMonthDelay -- >1 <2 not =>1 =<2 
,CASE WHEN DATEDIFF(MONTH, 
    (SELECT Date FROM dim.Calendar cal WHERE cal.DateID = rs.MaturityDateID), 
    (SELECT Date FROM dim.Calendar cal WHERE cal.DateID = rs.PaymentDateID)) 
     BETWEEN 2 AND 3 THEN 1 ELSE 0 END AS TwoMonthsDelay 
関連する問題