2015-12-14 6 views
0

последний раз, когда вы научили меня поворачивать, используя SELECT CASE, и это было очень полезно. На этот раз мне нужна помощь в чем-то более продвинутом.Вложенный поворот

ситуация выглядит следующим образом:

Я имею ту же самую старую базу данных смерти записи; столбец хранения причин содержит значение для всех причин, и я сделал, чтобы превратить его в п столбцы для п причин использования выберите случай, как этот

SELECT anno, cod_comune, 
SUM(CASE sex WHEN 'M' THEN 1 ELSE 0 END) AS M, 
SUM(CASE sex WHEN 'F' THEN 1 ELSE 0 END) AS F, 
SUM(CASE cod_tit WHEN 'I' THEN 1 ELSE 0 END) AS dis_I, 
SUM(CASE cod_tit WHEN 'II' THEN 1 ELSE 0 END) AS dis_II , 
SUM(CASE cod_tit WHEN 'III' THEN 1 ELSE 0 END) AS dis_III, 
... 
FROM casi 
WHERE cod_comune>40000 AND cod_comune<200000 AND cod_comune NOT LIKE '%00' 
GROUP BY anno, cod_comune, sex 
ORDER BY anno, cod_comune, age; 

Делая это я получаю 2 строки для каждого города, один для мужчин и один для женщин и число людей, погибших по каждой из причин.

То есть, я получаю что-то вроде этого

+------+------------+------+------+-------+--------+---------+ 
| anno | cod_comune | M | F | dis_I | dis_II | dis_III | 
+------+------------+------+------+-------+--------+---------+ 
| 2003 |  41001 | 0 | 19 |  0 |  5 |  0 | 
| 2003 |  41001 | 20 | 0 |  0 |  7 |  0 | 
| 2003 |  41002 | 12 | 0 |  0 |  3 |  0 | 
| 2003 |  41002 | 0 | 16 |  0 |  6 |  0 | 
| 2003 |  41003 | 8 | 0 |  0 |  1 |  0 | 
| 2003 |  41003 | 0 | 6 |  0 |  2 |  0 | 
| ... |  ... | ... | ... | ... | ... |  ... | 

Вместо этого, мой профессор сказал, что было бы желательно, если бы у меня была только одна строка для каждого города, сохраняя в любом случае гендерного различия.

Итак, мне нужно удвоить столбцы, связанные с причинами, например causeI_m и causeI_f. Я дал два условия для выбора случая, но он не работает, среди причин у меня есть все нули.

SELECT anno, cod_comune, 
SUM(CASE sex WHEN 'M' THEN 1 ELSE 0 END) AS M, 
SUM(CASE sex WHEN 'F' THEN 1 ELSE 0 END) AS F, 
SUM(CASE sex WHEN 'M' AND cod_tit='I' THEN 1 ELSE 0 END) AS dis_Im, 
SUM(CASE sex WHEN 'M' AND cod_tit='II' THEN 1 ELSE 0 END) AS dis_IIm , 
SUM(CASE sex WHEN 'M' AND cod_tit='III' THEN 1 ELSE 0 END) AS dis_IIIm, 
... 
SUM(CASE sex WHEN 'F' AND cod_tit='I' THEN 1 ELSE 0 END) AS dis_If, 
SUM(CASE sex WHEN 'F' AND cod_tit='II' THEN 1 ELSE 0 END) AS dis_IIf , 
SUM(CASE sex WHEN 'F' AND cod_tit='III' THEN 1 ELSE 0 END) AS dis_IIIf, 
... 
FROM casi 
WHERE cod_comune>40000 AND cod_comune<200000 AND cod_comune NOT LIKE '%00' 
GROUP BY anno, cod_comune, sex 
ORDER BY anno, cod_comune, age; 

Я получаю от этого запроса

+------+------------+------+------+--------+---------+--------+---------+ 
| anno | cod_comune | M | F | dis_Im | dis_IIm | dis_If | dis_IIf | 
+------+------------+------+------+--------+---------+--------+---------+ 
| 2003 |  41001 | 20 | 19 |  0 |  0 |  0 |  0 | 
| 2003 |  41002 | 12 | 16 |  0 |  0 |  0 |  0 | 
| 2003 |  41003 | 8 | 6 |  0 |  0 |  0 |  0 | 
| 2003 |  41004 | 7 | 5 |  0 |  0 |  0 |  0 | 
| 2003 |  41005 | 2 | 5 |  0 |  0 |  0 |  0 | 
| ... |  ... | ... | ... | ... | ... | ... | ... | 

Я учил, что я упорядочены базы данных, чтобы суммировать случаи, когда секс равно, что модальности и причиной является один Я указано. Но что-то не так, и я не могу понять, что. Я был бы рад, если бы вы мне немного помогли :) (Я надеюсь, что хорошо объяснил проблему, английский по-прежнему мой второй язык)

+1

Подготовить http://sqlfiddle.com с образцами данных, чтобы воссоздать ваш случай – lad2025

ответ

1

Возможно, я ошибаюсь, но я думаю, вам следует удалить «секс» "из описания группировки:

SELECT anno, cod_comune, 
SUM(CASE sex WHEN 'M' THEN 1 ELSE 0 END) AS M, 
SUM(CASE sex WHEN 'F' THEN 1 ELSE 0 END) AS F, 
SUM(CASE WHEN sex='M' AND cod_tit='I' THEN 1 ELSE 0 END) AS dis_M_I, 
SUM(CASE WHEN sex='M' AND cod_tit='II' THEN 1 ELSE 0 END) AS dis_M_II , 
SUM(CASE WHEN sex='M' AND cod_tit='III' THEN 1 ELSE 0 END) AS dis_M_III, 
SUM(CASE WHEN sex='F' AND cod_tit='I' THEN 1 ELSE 0 END) AS dis_F_I, 
SUM(CASE WHEN sex='F' AND cod_tit='II' THEN 1 ELSE 0 END) AS dis_F_II , 
SUM(CASE WHEN sex='F' AND cod_tit='III' THEN 1 ELSE 0 END) AS dis_F_III, 
... 
FROM casi 
WHERE cod_comune>40000 AND cod_comune<200000 AND cod_comune NOT LIKE '%00' 
GROUP BY anno, cod_comune -- !!! No sex here !!! 
ORDER BY anno, cod_comune, age; 

Это прекратит разделять ваши ряды по полу.

+0

Да, но удаление секса из группировки дает мне одну строку для каждого города, но больше нет различия между тем, сколько мужчин умерло по причине x и сколько женщины умерли по причине x, я получаю только сумму населения, умершего по этой причине в этом городе в этом году – Ale

+0

Поняв, вы можете использовать свой подход с добавлением дополнительных столбцов для каждого случая. См. Мой скорректированный ответ. Я немного скорректировал синтаксис, чтобы устранить нули, которые у вас были ранее. –

+0

Да, я понял! Оно работает! Большое спасибо! – Ale

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