您的位置:首页 > 数据库

SQL行列转换实例

2015-04-24 16:34 351 查看
1.准备表和测试数据

create table trandata (
id int primary key auto_increment,
flow_merc_id varchar(255),
tran_type varchar(255),
tran_amount int
);

create table trantype (
id int primary key auto_increment,
tran_type varchar(255)
);

insert into trantype (tran_type) values ('消费');
insert into trantype (tran_type) values ('消费撤销');
insert into trantype (tran_type) values ('预授权完成');
insert into trantype (tran_type) values ('预授权完成撤销');
insert into trantype (tran_type) values ('退货');

insert into trandata (flow_merc_id,tran_type,tran_amount) values ("1000","消费",5);
insert into trandata (flow_merc_id,tran_type,tran_amount) values ("1000","消费撤销",1);
insert into trandata (flow_merc_id,tran_type,tran_amount) values ("1000","消费",2);
insert into trandata (flow_merc_id,tran_type,tran_amount) values ("1000","预授权完成",3);
insert into trandata (flow_merc_id,tran_type,tran_amount) values ("1001","消费",4);
insert into trandata (flow_merc_id,tran_type,tran_amount) values ("1001","消费",6);
insert into trandata (flow_merc_id,tran_type,tran_amount) values ("1001","预授权完成撤销",7);
insert into trandata (flow_merc_id,tran_type,tran_amount) values ("1001","消费",9);
insert into trandata (flow_merc_id,tran_type,tran_amount) values ("1002","消费",7);
insert into trandata (flow_merc_id,tran_type,tran_amount) values ("1002","退货",7);
insert into trandata (flow_merc_id,tran_type,tran_amount) values ("1000","消费",2);
insert into trandata (flow_merc_id,tran_type,tran_amount) values ("1003","消费",3);
insert into trandata (flow_merc_id,tran_type,tran_amount) values ("1003","预授权完成",4);
insert into trandata (flow_merc_id,tran_type,tran_amount) values ("1003","消费",5);


trantype表内容:



trandata表内容:



2.问题描述

问题一:

将相同flow_merc_id,相同tran_type的记录合并,并算出交易笔数,交易金额的和。

select flow_merc_id as 商户编号, tran_type as 交易类型, count(tran_type) as 交易笔数, SUM(tran_amount) as 交易金额
from trandata GROUP BY flow_merc_id,tran_type




问题二:

统计出每个商户的各种交易类型的交易笔数,交易金额。

select
flow_merc_id as 商户编号,
count(tran_type) as 交易笔数,
SUM(tran_amount) as 交易金额,

sum(CASE tran_type WHEN '消费' THEN 1 ELSE 0 END ) 消费笔数,
sum(CASE tran_type WHEN '消费' THEN tran_amount ELSE 0 END ) 消费,

sum(CASE tran_type WHEN '消费撤销' THEN 1 ELSE 0 END ) 消费撤销笔数,
sum(CASE tran_type WHEN '消费撤销' THEN tran_amount ELSE 0 END ) 消费撤销,

sum(CASE tran_type WHEN '预授权完成' THEN 1 ELSE 0 END ) 预授权完成笔数,
sum(CASE tran_type WHEN '预授权完成' THEN tran_amount ELSE 0 END ) 预授权完成,

sum(CASE tran_type WHEN '预授权完成撤销' THEN 1 ELSE 0 END )预授权完成撤销笔数,
sum(CASE tran_type WHEN '预授权完成撤销' THEN tran_amount ELSE 0 END )预授权完成撤销,

sum(CASE tran_type WHEN '退货' THEN 1 ELSE 0 END ) 退货笔数,
sum(CASE tran_type WHEN '退货' THEN tran_amount ELSE 0 END ) 退货
from trandata GROUP BY flow_merc_id;




补充: CASE … WHEN …THEN … ELSE 也可以用if函数替换:

IF(expr1,expr2,expr3) -->  IF(tran_type='消费',1,0)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: