2017-09-26 31 views
0

我有一个数据透视表以及各自的字段。如何在数据透视表(MySQL)中将子列的值分组到子条目中

  1. 块上方
  2. MaleCount
  3. FemaleCount

是列名。所以,基本上,我已经按区域和区块分组了所有这些文件。为此,我在MySQL中编写了以下查询。

select 
ds.ds_name as district, 
bs.bl_name as block, 

case 
when sd.gender_id = 1 then count(gender_id) 
else 0 
end as MaleCount, 

case 
when sd.gender_id = then count(gender_id) 
else 0 
end as FemalCount, 

from studet data sd 
inner join district ds on ds.district_id = sd.ds_id 

inner join block bs on bs.block_id = sd.bs_id 

group by bs.block_name, ds.district_name; 

其给出以下结果

district | block | FemalCount | MaleCount 

    xyz  | abc | 4   | 5 

      | cvz | 5   | 9 

    ytz  | tyz | 7   | 3 

      | awe |3   |8 

最主要的是,我想下面的那种结果集。

district | block | FemalCount | MaleCount 

    xyz  | abc | 4   | 5 

      | cvz | 5   | 9 

    total |  | 9   | 14 

    ytz  | tyz | 7   | 3 

      | awe | 3   | 8 

    total |  | 10   | 11 

其中包括Malecount和FemaleCount的小计行,如上所述,按块和区分组。我怎么能在MySQL查询中实现这一点?

+0

什么是在零,cvz和null后产生子总数的逻辑,敬畏? –

+0

我想要区域明智的女性和男子计数小计。 –

+0

有一些东西看起来有问题 - 你选择ds.ds_name作为分区,但是通过ds.district_name(类似于块)选择组,当sd.gender_id =缺少女性计数的条件时,你说你想要按分区和块分组,但代码按块和分区分组,在femalcount之后和from语句之前有一个逗号,来自studet数据sd应该是什么。你想清理代码并提供一些示例数据吗? –

回答

0

你可以添加一个UNION ALL(与块的名称将其推到在量级上月底高值)来计算通过使某一地区总计

+----------+-----------+-------+-------+ 
| sudentid | gender_id | ds_id | bs_id | 
+----------+-----------+-------+-------+ 
|  101 |   2 |  3 |  2 | 
|  103 |   2 |  3 |  2 | 
|  112 |   1 |  3 |  3 | 
|  116 |   1 |  3 |  3 | 
|  117 |   1 |  3 |  3 | 
|  1 |   1 |  1 |  1 | 
|  2 |   1 |  1 |  1 | 
|  3 |   1 |  1 |  1 | 
+----------+-----------+-------+-------+ 
8 rows in set (0.00 sec) 

DROP TABLE IF EXISTS DISTRICT,BLOCK; 

CREATE TABLE DISTRICT (ID INT, name varchar(10)); 
create table block(id int, name varchar(10)); 

insert into district values (1,'aaa'),(2,'bbb'),(3,'ccc'),(4,'ddd'); 

insert into block values (1,'E'),(2,'F'),(3,'G'); 

select 
     case when block = 'zzz' then 'Total' 
       else district 
     end as district, 
     case when block = 'zzz' then '' 
     else block 
     end as block, 
     malecount,femalecount 
from 
(
select 
ds.name as district, 
bs.name as block, 
sum(case when gender_id = 1 then 1 else 0 end) Malecount, 
sum(case when gender_id = 2 then 1 else 0 end) Femalecount 
from student sd 
inner join district ds on ds.id = sd.ds_id 
inner join block bs on bs.id = sd.bs_id 
group by ds.name, bs.name 

union all 
select district,'zzz', malecount,femalecount 
from 
(
select ds.name as district, 
sum(case when gender_id = 1 then 1 else 0 end) Malecount, 
sum(case when gender_id = 2 then 1 else 0 end) Femalecount 
from student sd 
inner join district ds on ds.id = sd.ds_id 
group by ds.name 
) s 
) t 
order by t.district,t.block 
; 

结果

+----------+-------+-----------+-------------+ 
| district | block | malecount | femalecount | 
+----------+-------+-----------+-------------+ 
| aaa  | E  |   3 |   0 | 
| Total |  |   3 |   0 | 
| ccc  | F  |   0 |   2 | 
| ccc  | G  |   3 |   0 | 
| Total |  |   3 |   2 | 
+----------+-------+-----------+-------------+ 
5 rows in set (0.00 sec) 

请注意稍稍不详细的条件聚合(总和(当...的情况下)

+0

谢谢。它帮助我很多。 –