2015-12-14 65 views
0

上次你教我使用SELECT CASE的pivoting,它非常有幫助。 這次我需要更高級的幫助。嵌套pivoting

情況如下:

我有同樣的老死亡記錄數據庫;列存儲的原因包含的值全部原因,我提出把它變成了N將導致n列使用選擇的情況下,像這樣

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 | 
| ... |  ... | ... | ... | ... | ... |  ... | 

相反,我的教授說,這將是可取的,如果我只有1行每個鎮,反正保持性別的區分。

所以,我打算加倍有關原因的列,例如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 | 
| ... |  ... | ... | ... | ... | ... | ... | ... | 

我因子評分,我已經orderd數據庫進行總結的情況下,當性愛等於形態和事業是一個我已經得到指定。但有些事情是錯誤的,我無法弄清楚什麼。 我會很高興,如果你給我一點幫助:) (我希望能有很好的解釋這個問題,英語仍然是我的第二語言)

+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