2013-09-21 5 views
0

Можно ли упорядочить следующий оператор case или у меня уже есть его в самой изящной форме?SQL optimize select case statement

select case when Ks2en = '' then 'No KS2' else ks2en end as 'KS2', 
     nullif(count(case result when '' then 1 end),0) as 'No Result', 
     nullif(count(case result when 'U' then 1 when '1a' then 1 when '1b' then 1 when '1c' then 1 end),0) as '1/U', 
     nullif(count(case result when 'U' then 1 when '2a' then 1 when '2b' then 1 when '2c' then 1 end),0) as '2/U', 
     nullif(count(case result when 'G-' then 1 when '3c' then 1 end),0) as '3c/G-', 
     nullif(count(case result when 'G' then 1 when '3b' then 1 end),0) as '3b/G', 
     nullif(count(case result when 'G+' then 1 when '3a' then 1 end),0) as '3a/G+', 
     nullif(count(case result when 'F-' then 1 when '4c' then 1 end),0) as '4c/F-', 
     nullif(count(case result when 'F' then 1 when '4b' then 1 end),0) as '4b/F' 
     **snip** 
    from student join subject 
    on subject.upn=student.upn 
where name='English' 
group by ks2en 
order by 
case when ks2en = 'W' Then 0 Else 1 End, 
    left(ks2en, 1), 
    right(ks2en, 1) desc 

Он генерирует следующую сетку, и я хотел бы, чтобы этот результат остается тем же:

KS2 No Result 1/U  2/U  3c/G- 3b/G 3a/G+ 4c/F- 4b/F **snip** 
No KS2   1  NULL NULL NULL NULL NULL NULL **snip** 
2a NULL  NULL NULL NULL NULL NULL 2  1  **snip** 
3c 1   NULL NULL NULL NULL NULL NULL NULL **snip** 
3b NULL  NULL NULL NULL NULL NULL 1  NULL **snip** 
3a 1   NULL NULL NULL NULL NULL NULL NULL **snip** 
4c NULL  1  1  NULL NULL NULL NULL NULL **snip** 
4b NULL  NULL NULL NULL NULL NULL NULL NULL **snip** 
4a NULL  1  1  NULL NULL NULL NULL NULL **snip** 
5c NULL  NULL NULL NULL NULL NULL NULL NULL **snip** 
5b NULL  NULL NULL NULL NULL NULL NULL NULL **snip** 

Я отрезала код и результаты ради brevities, но SQL содержит довольно много более для создания столбцов итогов.

+0

*** SQL *** - это только * Структурированный язык запросов * - язык, используемый многими системами баз данных, но не продукт базы данных ... многие вещи специфичны для поставщиков, поэтому нам действительно нужно знаете, что ** система баз данных ** (и какая версия) вы используете (пожалуйста, обновите теги соответственно) .... –

ответ

1

Я не думаю, что этот код повышает производительность, поэтому я отправляю другой способ сделать это, чтобы ИМО был более изящным. Я использую result in ([listofoptions]) вместо нескольких case ... when, я не думаю, что выполнение сильно изменится.

select case when Ks2en = '' then 'No KS2' else ks2en end as 'KS2', 
     nullif(count(case when result = '' then 1 end),0) as 'No Result', 
     nullif(count(case when result IN ('U', '1a', '1b', '1c') then 1 end),0) as '1/U', 
     nullif(count(case when result IN ('U', '2a', '2b', '2c') then 1 end),0) as '2/U', 
     nullif(count(case when result IN ('G-','3c') then 1 end),0) as '3c/G-', 
     nullif(count(case when result IN ('G', '3b') then 1 end),0) as '3b/G', 
     nullif(count(case when result IN ('G+','3a') then 1 end),0) as '3a/G+', 
     nullif(count(case when result IN('F-','4c') then 1 end),0) as '4c/F-', 
     nullif(count(case when result IN('F', '4b') then 1 end),0) as '4b/F' 

from student 
inner join subject 
    on subject.upn=student.upn 
where name='English' 
group by ks2en 
order by 
case when ks2en = 'W' Then 0 Else 1 End, 
    left(ks2en, 1), 
    right(ks2en, 1) DESC 
+0

Это то, что я был после. Большое спасибо! – Matt

+0

Мое удовольствие, сэр –