SQL Server: Case语句求和

3
我有以下嵌套查询。
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) 

你的输出与查询不匹配。 - TheGameiswar
@TTeeple请指导,需要哪些详细信息。 - YelizavetaYR
从你的问题来看:“这是具体情况而定的”。我们需要知道那些具体情况是什么。 - TTeeple
@TTeeple,情况如下:场景1-添加所有c座位;场景2-添加所有c座位,但仅在价格等于特定值(例如800)的情况下;场景3-添加所有c座位,其中价格为(800、500、300)等。其余情况都是以上3种情况的变体。谢谢。 - YelizavetaYR
不要在注释中添加细节;[编辑]您的问题并在那里添加它们,这样它们就可以被看到(并正确格式化)。 - Ken White
显示剩余2条评论
1个回答

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

在微软的定义中,相关语法示例如下: 搜索 CASE 表达式:

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

在这个 WHEN program = 'lu' THEN seats ELSE 0 后面,我收到了一个错误信息,内容是 Incorrect syntax near the keyword 'WHEN'. 很抱歉这并没有提供太多帮助。 - YelizavetaYR
请尝试仅使用一个ELSE子句再次执行。 - Beth
Microsoft SQL Server Management Studio - 10.50.4000.0,SQL 2008 R2 - YelizavetaYR
@YelizavetaYR,fyear在哪张表里?你只需要将它与lt_data连接起来,这样你就可以通过这些行进行限制。 - Beth
fyear 只在 lt_data 中 -- 它最终将成为 @fyear 一个临时变量,作为传递参数来限制数据,但除了 lt_data 之外,它还会连接到什么? - YelizavetaYR
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接