2016-08-04 84 views
3

我有以下嵌套查詢SQL服務器:Case語句總和

select 
    sum(c.seats) as countPerfs, b.program, b.Prog_id 
from   
    #LT_TEMP TableP 
join   
    C_PROGRAM b on TableP.program_id = b.Prog_id 
join   
    lt_data c on b.Program = c.program 
join   
    LTR_BUDGET_REF a on TableP.program_id = a.ProgramID 
where  
    a.Participants = 'Y' 
    and fyear = 2016 
group by  
    b.Program, b.Prog_id 

它返回的輸出,看起來像這樣:

program_id season program performance workshops artists_sess participants audience 
6   2016 LU:  NULL  NULL   NULL   NULL   NULL 
7   2016 NC:  NULL  NULL   NULL   NULL   NULL 
11   2016 AC:  NULL  NULL   NULL   NULL   NULL 
12   2016 PD:  NULL  NULL   NULL   NULL   NULL 
19   2016 MC:  NULL  NULL   NULL   NULL   NULL 

每個項目都有不同的邏輯 - 所以如果我想計算讓我們說參與者。但是當程序是MC時,我們只想返回/求和某些數據。但是當程序是LU時,我們要計算所有的數據。等等。 如何構建該案例陳述。

例如,如果程序是MC,我們希望將c.seats(來自lt_data),但只有價格= 800的地方求和。但是如果程序是LU,我們想爲所有價格求和。如果程序是PD,我們想要在價格爲800,500和300的地方求和。事情就是這樣。它是一個個案的基礎,但我不知道如何構造它。

在此先感謝。

這是一個完整的查詢

UPDATE 
     #LT_TEMP 
SET  
     program = h.Program, 
     participants = h.countPerfs 
FROM   
(
       select sum(c.seats) as countPerfs, b.program, b.Prog_id 
       from  #LT_TEMP TableP 
       join  C_PROGRAM b on TableP.program_id = b.Prog_id 
       join  lt_data c on b.Program = c.program 
       join  LTR_BUDGET_REF a on TableP.program_id = a.ProgramID 
       where  a.Participants = 'Y' 
       and   fyear = 2016 
       group by b.Program, b.Prog_id 
) h 
where h.Prog_id = #LT_TEMP.program_id 
and h.Prog_id not in (27, 28, 29) 
+0

您的輸出不匹配您的查詢 – TheGameiswar

+0

一些'外部應用程序'應該做的伎倆。如果你想要實際的代碼,需要更多關於個案情況的細節。 – TTeeple

+0

我已更新查詢以添加完整的sql/update語句。但問題出現在我想要更新總和的中間部分 - 一系列情況。謝謝。 – YelizavetaYR

回答

2

我認爲你正在試圖做的聚集和CASE邏輯在過高的水平。嘗試在按計劃分組LT_DATA的子查詢做:

SELECT 
    c.Prog_id, 
    fyear AS season, 
    c.program, 
    SUM(l.seats) AS countPerfs 
FROM   
    #LT_TEMP t JOIN   
    C_PROGRAM c ON 
    t.program_id = c.Prog_id JOIN   
    (SELECT 
     fyear, 
     program, 
     SUM(CASE 
      WHEN program = 'mc:' AND price = 800 THEN seats 
      WHEN program = 'lu:' THEN seats 
      WHEN program = 'pd:' and price in (300, 500, 800) then seats 
      ELSE seats 
     END) AS calc 
    FROM 
     lt_data 
    GROUP BY 
     fyear, program) l ON 
    c.Program = l.program JOIN   
    LTR_BUDGET_REF b ON 
    TableP.program_id = b.ProgramID 
WHERE  
    b.Participants = 'Y'  AND 
    fyear = @fyear 
GROUP BY 
    c.Prog_id, 
    fyear, 
    c.Program 

在MS的definition相關的語法的例子是: 搜索CASE表達式:

CASE 
    WHEN Boolean_expression THEN result_expression [ ...n ] 
    [ ELSE else_result_expression ] 
END 
+0

在此'WHEN程序='lu'後,我收到一條錯誤消息'THEN'ELSE 0',它讀取'WHEN'附近的語法錯誤。'對不起,這沒什麼幫助 – YelizavetaYR

+0

只用一個ELSE子句再試一次 – Beth

+0

我已經評論掉fyear系統也在抱怨它的無效,但唯一的辦法是我得到了這個案例的工作是取出所有whens和其他(只是離開第一行) – YelizavetaYR