簡體   English   中英

在SQL中正確使用IF存在

[英]Correct Usage of IF Exists in SQL

我試圖在下面運行以下SQL語句

    select  FB.FundingSourceID,
          FB.FiscalYearID,
          (FB.FundingBudget-CA.CurrentAmount-DE.CFOApproved) as Amount from    
           (select 
            FundingSourceID, 
            FiscalYearID, 
            SUM(COALESCE(Amount,0)) as FundingBudget 
           from [cap].[FactFundingSourceBudget]
           WHERE IsDeleted = 0
           group by FundingSourceID, FiscalYearID) AS FB

LEFT JOIN (
           select 
            FundingSourceID, 
            FiscalYearID, 
            SUM(COALESCE([Current],0)) as CurrentAmount 
           from [cap].[FactSampledFunding] F
           WHERE F.IsDeleted = 0
           group by  FundingSourceID, FiscalYearID) AS CA on CA.FundingSourceID = FB.FundingSourceID and CA.FiscalYearID = FB.FiscalYearID

LEFT JOIN (
           IF EXISTS (SELECT FundingSourceID, FiscalYearID, SUM(COALESCE(PF.Amount,0))AS CFOApproved FROM [cap].[FactProjectFunding] PF
           INNER JOIN [cap].[DimProject] DP ON DP.ProjectID = PF.ProjectID
           INNER JOIN [dbo].[WFToken] WT ON DP.MemberGUID = WT.EntityGUID
           INNER JOIN [dbo].[WFWorkflowStep] WFT ON WFT.WorkflowStepGUID = WT.WorkflowStepGUID
           WHERE PF.IsDeleted = 0 AND WFT.Name IN ('Cancer Center Review', 'Outpatient Center Review', 'Corporate EVP CFO Review', 'Corporate EVP Review', 'Capital Committee Review')
           GROUP BY  FundingSourceID, FiscalYearID)
           SELECT FundingSourceID, FiscalYearID, SUM(COALESCE(PF.Amount,0))AS CFOApproved FROM [cap].[FactProjectFunding] PF
           INNER JOIN [cap].[DimProject] DP ON DP.ProjectID = PF.ProjectID
           INNER JOIN [dbo].[WFToken] WT ON DP.MemberGUID = WT.EntityGUID
           INNER JOIN [dbo].[WFWorkflowStep] WFT ON WFT.WorkflowStepGUID = WT.WorkflowStepGUID
           WHERE PF.IsDeleted = 0 AND WFT.Name IN ('Cancer Center Review', 'Outpatient Center Review', 'Corporate EVP CFO Review', 'Corporate EVP Review', 'Capital Committee Review')
           GROUP BY  FundingSourceID, FiscalYearID
           ELSE 
           SELECT 0 AS [FundingSourceID], 0 as [FiscalYearID], 0 as [CFOApproved]
           ) AS DE on DE.FundingSourceID = FB.FundingSourceID and DE.FiscalYearID = FB.FiscalYearID
        WHERE
         FB.FundingSourceID != 1

我得到的錯誤是:

Msg 156, Level 15, State 1, Line 20
Incorrect syntax near the keyword 'IF'.
Msg 102, Level 15, State 1, Line 34
Incorrect syntax near ')'. 

這可能是由於Exists聲明的使用不正確,有些人可以幫幫我嗎?

如上所述,您無法在查詢中使用IF語句。 當您的子查詢產生NULL結果時,您正在尋找的是一種處理AMOUNT計算的方法。 以下使用ISNULL表達式來處理此問題:

SELECT
  FB.FundingSourceID,
  FB.FiscalYearID,
  ( FB.FundingBudget - ISNULL(CA.CurrentAmount, 0) - ISNULL(DE.CFOApproved, 0) ) AS Amount
FROM
  (
    SELECT
      FundingSourceID,
      FiscalYearID,
      SUM(COALESCE(Amount, 0)) AS FundingBudget
    FROM
      [cap].[FactFundingSourceBudget]
    WHERE
      IsDeleted = 0
    GROUP BY
      FundingSourceID,
      FiscalYearID
  ) AS FB
  LEFT JOIN (
              SELECT
                FundingSourceID,
                FiscalYearID,
                SUM(COALESCE([Current], 0)) AS CurrentAmount
              FROM
                [cap].[FactSampledFunding] F
              WHERE
                F.IsDeleted = 0
              GROUP BY
                FundingSourceID,
                FiscalYearID
            ) AS CA
    ON CA.FundingSourceID = FB.FundingSourceID
       AND CA.FiscalYearID = FB.FiscalYearID
  LEFT JOIN (
              SELECT
                FundingSourceID,
                FiscalYearID,
                SUM(COALESCE(PF.Amount, 0)) AS CFOApproved
              FROM
                [cap].[FactProjectFunding] PF
                INNER JOIN [cap].[DimProject] DP
                  ON DP.ProjectID = PF.ProjectID
                INNER JOIN [dbo].[WFToken] WT
                  ON DP.MemberGUID = WT.EntityGUID
                INNER JOIN [dbo].[WFWorkflowStep] WFT
                  ON WFT.WorkflowStepGUID = WT.WorkflowStepGUID
              WHERE
                PF.IsDeleted = 0
                AND WFT.Name IN ( 'Cancer Center Review',
                                  'Outpatient Center Review',
                                  'Corporate EVP CFO Review',
                                  'Corporate EVP Review',
                                  'Capital Committee Review' )
              GROUP BY
                FundingSourceID,
                FiscalYearID
            ) AS DE
    ON DE.FundingSourceID = FB.FundingSourceID
       AND DE.FiscalYearID = FB.FiscalYearID
WHERE
  FB.FundingSourceID != 1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM