【问题标题】:Nested pivoting嵌套旋转
【发布时间】:2016-03-19 15:00:34
【问题描述】:

上次你教我使用 SELECT CASE 进行旋转,它非常有帮助。 这次我需要一些更高级的帮助。

情况如下:

我有相同的旧死亡记录数据库;存储原因的列包含所有原因的值,我使用选择案例将其转换为 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 行,保持性别差异,那将是可取的。

因此,我将与原因相关的列加倍,例如原因I_m 和原因I_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 |
| ...  |      ...   |  ... |  ... |   ...  |   ...   |    ... |  ...    |

我已经命令数据库对性等于该模态的情况进行汇总,并且原因是我指定的原因。但是出了点问题,我不知道是什么。 如果你能给我一点帮助,我会很高兴 :) (我希望能很好地解释问题,英语仍然是我的第二语言)

【问题讨论】:

标签: mysql sql select case


【解决方案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;

这将停止按性别拆分行。

【讨论】:

  • 是的,但是从分组中删除性别会给每个城镇一个单独的行,但是在有多少男性死于原因 x 和有多少女性死于原因 x 之间不再有区别,我只得到总和当年该城市因该原因死亡的人口数
  • 知道了,您可以使用您的方法为每个案例添加额外的列。请参阅我调整后的答案。我只是稍微调整了语法以消除你之前的零。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-16
相关资源
最近更新 更多