2014-10-08 2 views
0

Я пишу начало SP для SQL-сервера, используя несколько операторов case и temp-таблиц с условным аргументом else else в конце, чтобы вычесть значения друг от друга на основе условное дело else.Microsoft SQL server CASE ELSE CASE не закрывается справа

Все работает нормально, пока не дойду до условного случая else, где по какой-то причине END не совсем прав.

Как вы можете видеть из инструкции условного case else, только одна синтаксическая ошибка в скобке после END.

Любые советы были бы весьма полезными.

Заранее спасибо.

--Creates a temp table to store the results of the cases below ans inserts them into the table. 
CREATE TABLE #TotalBySlSsCs(

    BoughtTotal FLOAT NULL, 
    SoldTotal FLOAT NULL, 
    SSaleTotal FLOAT NULL, 
    CShortTotal FLOAT NULL, 
    TotalQuanity Float NULL 
) 

INSERT INTO #TotalBySlSsCs(BoughtTotal, SoldTotal, SSaleTotal, CShortTotal) 

-- Cases to total the quanities for portfilios and securities based on the transcode is in ('by', 'sl', 'ss', 'cs') plus the portfolio, security, and date selected by the user. 
SELECT 
    SUM(CASE WHEN FundTransactions.TransCode='by' THEN (CAST(FundTransactions.Quantity AS FLOAT)) ELSE 0 END) AS 'BoughtTotal', 
    SUM(CASE WHEN FundTransactions.TransCode='sl' THEN (CAST(FundTransactions.Quantity AS FLOAT)) ELSE 0 END) AS 'SoldTotal', 
    SUM(CASE WHEN FundTransactions.TransCode='ss' THEN (CAST(FundTransactions.Quantity AS FLOAT)) ELSE 0 END) AS 'SSaleTotal', 
    SUM(CASE WHEN FundTransactions.TransCode='cs' THEN (CAST(FundTransactions.Quantity AS FLOAT)) ELSE 0 END) AS 'CShortTotal' 

FROM FundTransactions 
--The Where section will contain @parameters to let users select the portfolio, security, and date they need. 
WHERE FundTransactions.PortfolioCode = 'EFS' AND FundTransactions.SecSymbol = 'VXX' AND FundTransactions.TradeDate= '2014-06-30' 
GROUP BY FundTransactions.TransCode 

--Group on Total Quanity to remove the second uneeded row which is created by the above cases and inserts it into temp table #TotalQuanities for calculations.. 
CREATE TABLE #TotalQuanities(
    TotalQuanity VARCHAR(4) NULL, 
    TotalBy FLOAT NULL, 
    TotalSl FLOAT NULL, 
    TotalSs FLOAT NULL, 
    TotalCs FLOAT NULL 
) 

INSERT INTO #TotalQuanities(TotalQuanity, TotalBy, TotalSl, TotalSs, TotalCs) 

SELECT #TotalBySlSsCs.TotalQuanity, MAX(#TotalBySlSsCs.BoughtTotal), MAX(#TotalBySlSsCs.SoldTotal), MAX(#TotalBySlSsCs.SSaleTotal), MAX(#TotalBySlSsCs.CShortTotal) 

FROM #TotalBySlSsCs 
GROUP BY #TotalBySlSsCs.TotalQuanity 

--Case statement for subtracting the final figures from each other based on conditions within the case statement. 
SELECT #TotalQuanities.TotalQuanity, 
    SUM(CASE WHEN #TotalQuanities.TotalBy = 0 AND #TotalQuanities.TotalSl = 0 AND #TotalQuanities.TotalSs = 0 AND #TotalQuanities.TotalCs = 0 
     THEN 0 

     ELSE 

     CASE WHEN #TotalQuanities.TotalBy != 0 AND #TotalQuanities.TotalSl != 0 AND #TotalQuanities.TotalSs != 0 AND #TotalQuanities.TotalCs != 0 
     THEN #TotalQuanities.TotalBy - #TotalQuanities.TotalSl - #TotalQuanities.TotalSs - #TotalQuanities.TotalCs 

     ELSE 

     CASE WHEN #TotalQuanities.TotalBy = 0 AND #TotalQuanities.TotalSl != 0 AND #TotalQuanities.TotalSs != 0 AND #TotalQuanities.TotalCs != 0 
     THEN #TotalQuanities.TotalSl - #TotalQuanities.TotalSs - #TotalQuanities.TotalCs 

     ELSE 

     CASE WHEN #TotalQuanities.TotalBy = 0 AND #TotalQuanities.TotalSl = 0 AND #TotalQuanities.TotalSs != 0 AND #TotalQuanities.TotalCs != 0 
     THEN #TotalQuanities.TotalSs - #TotalQuanities.TotalCs 

     ELSE 

     CASE WHEN #TotalQuanities.TotalBy = 0 AND #TotalQuanities.TotalSl = 0 AND #TotalQuanities.TotalSs = 0 AND #TotalQuanities.TotalCs != 0 
     THEN #TotalQuanities.TotalCs 

     END) AS 'TOTAL' 


FROM #TotalQuanities 
GROUP BY #TotalQuanities.TotalQuanity 

--Drops the temp tables. 
DROP TABLE #TotalBySlSsCs 
DROP TABLE #TotalQuanities 

ответ

0

Вы не повторяете case в случае утверждений для нескольких условий. Попробуйте это:

SUM(CASE WHEN #TotalQuanities.TotalBy = 0 AND #TotalQuanities.TotalSl = 0 AND #TotalQuanities.TotalSs = 0 AND #TotalQuanities.TotalCs = 0 
    THEN 0 

    WHEN #TotalQuanities.TotalBy != 0 AND #TotalQuanities.TotalSl != 0 AND #TotalQuanities.TotalSs != 0 AND #TotalQuanities.TotalCs != 0 
    THEN #TotalQuanities.TotalBy - #TotalQuanities.TotalSl - #TotalQuanities.TotalSs - #TotalQuanities.TotalCs 

    WHEN #TotalQuanities.TotalBy = 0 AND #TotalQuanities.TotalSl != 0 AND #TotalQuanities.TotalSs != 0 AND #TotalQuanities.TotalCs != 0 
    THEN #TotalQuanities.TotalSl - #TotalQuanities.TotalSs - #TotalQuanities.TotalCs 

    WHEN #TotalQuanities.TotalBy = 0 AND #TotalQuanities.TotalSl = 0 AND #TotalQuanities.TotalSs != 0 AND #TotalQuanities.TotalCs != 0 
    THEN #TotalQuanities.TotalSs - #TotalQuanities.TotalCs 

    WHEN #TotalQuanities.TotalBy = 0 AND #TotalQuanities.TotalSl = 0 AND #TotalQuanities.TotalSs = 0 AND #TotalQuanities.TotalCs != 0 
    THEN #TotalQuanities.TotalCs 

    END) AS TOTAL 

Кроме того, вы не должны использовать одиночные кавычки для столбца или таблицы псевдонимов, но это другое дело.

+0

Спасибо за помощь Гордон, оценить его. Также очень хорошая точка о одиночных кавычках. Лень с моей стороны. –

1

замените корпус с ниже

SELECT #TotalQuanities.TotalQuanity, 
    SUM(CASE WHEN #TotalQuanities.TotalBy = 0 AND #TotalQuanities.TotalSl = 0 AND #TotalQuanities.TotalSs = 0 AND #TotalQuanities.TotalCs = 0 
     THEN 0 
     WHEN #TotalQuanities.TotalBy != 0 AND #TotalQuanities.TotalSl != 0 AND #TotalQuanities.TotalSs != 0 AND #TotalQuanities.TotalCs != 0 
     THEN #TotalQuanities.TotalBy - #TotalQuanities.TotalSl - #TotalQuanities.TotalSs - #TotalQuanities.TotalCs 
     WHEN #TotalQuanities.TotalBy = 0 AND #TotalQuanities.TotalSl != 0 AND #TotalQuanities.TotalSs != 0 AND #TotalQuanities.TotalCs != 0 
     THEN #TotalQuanities.TotalSl - #TotalQuanities.TotalSs - #TotalQuanities.TotalCs 
     WHEN #TotalQuanities.TotalBy = 0 AND #TotalQuanities.TotalSl = 0 AND #TotalQuanities.TotalSs != 0 AND #TotalQuanities.TotalCs != 0 
     THEN #TotalQuanities.TotalSs - #TotalQuanities.TotalCs 
     WHEN #TotalQuanities.TotalBy = 0 AND #TotalQuanities.TotalSl = 0 AND #TotalQuanities.TotalSs = 0 AND #TotalQuanities.TotalCs != 0 
     THEN #TotalQuanities.TotalCs 

     END) AS 'TOTAL' 
FROM #TotalQuanities 
GROUP BY #TotalQuanities.TotalQuanity