2014-10-22 5 views
1

Я новичок в Sql. Логика этих таблиц без условия IF всегда меня раздражает. У меня есть таблица (MyTable), как это:SQL Embeded Case

ID ProjectID ClassType ClassYear Amount 
1 1 A 2014 0.00 
2 1 A 2014 0.00 
3 1 B 2014 300.00 
5 1 B 2013 100.00 
6 1 C 2015 200.00 
7 1 A 2013 0.00 
8 1 B 2015 200.00 
9 1 B 2014 500.00 
11 1 B 2015 230.00 
.... 

Мой исходный код следующим образом работает отлично:

Some code 
from 
(
    Select projectID, sum(currentyear) as CurrentYear, sum(prioryear) as PriorYear, sum(postyear) as PostYear 
    from 
     (select ProjectID, 
      case when Classyear = 2014 then Amount else 0 end as currentyear, 
      case when ClassYear <2014 then Amount else 0 end as prioryear, 
      case when ClassYear > 2014 then Amount else 0 end as postyear 
      from MyTable 
      where classtype = 'A' 
     ) as subtable 
    group by subtable.ProjectID 
) 

Сейчас я хочу добавить еще вариант для ClassType в выше и не могу понять вне как. Логика должна быть:

если общая сумма от classtype A в проекте равна 0 (другими словами, эти три числа - все 0), тогда условие where должно измениться на classtype = 'B'. Если classtype B все еще 0, то используйте classtype C. (Это будет ОК, если C по-прежнему 0).

Куда я должен положить новое условие случая?

Большое спасибо.

ответ

1

мы можем получить общее количество, используя GROUP BY для каждого типа класса, а затем отфильтровать соответствующее значение.

SELECT * 
FROM 
(
select *, ROW_NUMBER() over (partition by projectId order by classType) as seq FROM 
(
    Select projectID, classType, sum(Amount) as Total, 
      sum(case when Classyear = 2014 then Amount else 0 end) as CurrentYear, 
      sum(case when ClassYear <2014 then Amount else 0 end) as PriorYear, 
      sum(case when ClassYear > 2014 then Amount else 0 end) as PostYear 

    from 
    myTable 
    group by ProjectID, classType 
) T 
Where (T.Total >0 and classType <> 'C') or classType ='C' 
) C 
where seq =1 
+0

Вы гений. Похоже, мне нужно что-то изменить с языка кодирования на SQL. Они полностью по-разному. Большое спасибо, Радар. – user3191850

+0

Ops, на самом деле он отлично работает только для одного projectID, я хочу собрать для всех projectID. Не работайте в этой ситуации. – user3191850

+0

@ user3191850, можете ли вы объяснить это немного больше? – radar