2017-09-26 9 views
0

각 필드가있는 피벗 테이블이 있습니다.그룹 단락으로 피벗 테이블 (MySQL)의 총 열 값을 서브하는 방법

  1. 지구
  2. 블록
  3. MaleCount
  4. FemaleCount

상기 열 이름이다. 그래서 기본적으로 지구와 블록 단위로 정리 한 모든 자료를 정리했습니다. 이를 위해 MySQL에 다음 쿼리를 작성했습니다. 다음과 같은 결과

district | block | FemalCount | MaleCount 

    xyz  | abc | 4   | 5 

      | cvz | 5   | 9 

    ytz  | tyz | 7   | 3 

      | awe |3   |8 

중요한 것은이 있습니다

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; 

, 나는 결과 집합의 다음과 같은 종류를 원한다. 위에서 언급 같은 블록 지구에 의해 그룹 Malecount 및 FemaleCount하는 부분합 행을 포함

district | block | FemalCount | MaleCount 

    xyz  | abc | 4   | 5 

      | cvz | 5   | 9 

    total |  | 9   | 14 

    ytz  | tyz | 7   | 3 

      | awe | 3   | 8 

    total |  | 10   | 11 

. MySQL 쿼리에서 어떻게 이것을 얻을 수 있습니까?

+0

null, cvz 및 null, 경외구 이후에 소계를 산출하는 논리는 무엇입니까? –

+0

지구의 현명한 여성과 남성 수 소계. –

+0

쿼리에 잘못 표시되는 몇 가지 사항이 있습니다. ds.ds_name을 지구로 선택하고 ds.district_name (블록과 유사)으로 그룹화하면 sd.gender_id =에 여성 수에 대한 조건이 누락되면 원하는대로 말할 수 있습니다. 지역별로 그룹화하고 차단하지만 코드는 블록 및 구획별로 그룹화됩니다. 여성 수 이후 및 from 문의 전에 쉼표가 있고 studet 데이터 sd에서 오는 것은 무엇입니까? 코드를 정리하고 샘플 데이터를 제공 하시겠습니까? –

답변

0

당신은 너무 특정 지역으로 합계를 계산하기 위해 모든 (기준 순서에 끝까지 밀어 블록 이름 높은 값으로) 노동 조합을 추가 할 수

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

고맙습니다. 그것은 나를 많이 돕는다. –