2016-08-04 11 views
3

У меня есть следующие вложенных запросSQL Server: Дело Заявление Sum

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, мы хотим рассчитать все данные. и так далее. Как создать этот оператор case.

например, если программа MC, мы хотим суммировать c.seats (from 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

Пара «ВНЕШНЕЙ ЧАСТИ APPLY» должна сделать трюк. Если вы хотите получить реальный код, вам потребуется больше информации о сценариях по каждому случаю. – 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 
    WHEN Boolean_expression THEN result_expression [ ...n ] 
    [ ELSE else_result_expression ] 
END 
+0

Я получаю сообщение об ошибке после этого 'WHEN program = 'lu' THEN устанавливает ELSE 0', который читает' Неправильный синтаксис рядом с ключевым словом 'WHEN'. 'Извините, что это не очень полезно. – YelizavetaYR

+0

попробуйте еще раз с помощью только одного предложения ELSE – Beth

+0

У меня также был комментарий fyear, и система жаловалась, что ее недействительно, но единственный способ, которым я получил дело, состоял в том, чтобы вытащить все время и другое (просто покинув первую строку) – YelizavetaYR

Смежные вопросы