1. 程式人生 > >SQL行轉列、列轉行

SQL行轉列、列轉行

SQL行轉列、列轉行

這個主題還是比較常見的,行轉列主要適用於對資料作聚合統計,如統計某類目的商品在某個時間區間的銷售情況。列轉行問題同樣也很常見。

一、整理測試資料

create table wyc_test(
	id int(32) not null auto_increment,
	name varchar(80) default null,
	date date default null,
	scount int(32),
	primary key (id)
);
INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (1,'小說','2013-09-01',10000);
INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (2,'微信','2013-09-01',20000);
INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (3,'小說','2013-09-02',30000);
INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (4,'微信','2013-09-02',35000);
INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (5,'小說','2013-09-03',31000);
INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (6,'微信','2013-09-03',36000);
INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (7,'小說','2013-09-04',35000);
INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (8,'微信','2013-09-04',38000);
INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (9,'小說','2013-09-01',80000);
INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (10,'微信','2013-09-01',70000);

二、行轉列

主要思路是分組後使用case進行條件判斷處理

#行轉列
select 
    a.date,
    sum(case a.name
        when '小說' then a.scount
        else 0
    end) 'sum_小說',
    max(case a.name
        when '小說' then a.scount
        else 0
    end) 'max_小說',
    sum(case a.name
        when '微信' then a.scount
        else 0
    end) '微信',
    max(case a.name
        when '小說' then a.scount
        else 0
    end) 'max_微信'
from
    wyc_test a
group by date;

結果:


三、列轉行

主要思路也是分組後使用case

#列轉行
select 
    a.date,
    concat('小說:',
            cast(sum(case a.name
                    when '小說' then a.scount
                    else 0
                end)
                as char),
            '微信',
            cast(sum(case a.name
                    when '微信' then a.scount
                    else 0
                end)
                as char)) as 'str'
from
    wyc_test a
group by a.date;
#列轉行
#1.使用mysql提供的函式分組
select a.date,group_concat(a.name,'總量:', a.scount) from wyc_test a group by a.date,a.name;
#2.使用mysql提供的函式分組
select a.date,a.name, group_concat(a.name, '總量:', a.scount) from wyc_test a group by a.date,a.name;
#3.普通group結合字串拼接
SELECT 
    a.date,
    concat('小說總量:',
            cast(sum(case a.name
                    when '小說' then a.scount
                    else 0
                end)
                as char)) as '小說',
    concat('微信總量:',
            cast(sum(case a.name
                    when '微信' then a.scount
                    else 0
                end)
                as char)) as '微信'
from
    wyc_test a
group by a.date;
結果:

四、資料資料

1.http://www.cnblogs.com/lhj588/p/3315876.html