记录一次mysql统计数据将列查出的值转换为行名使用

 

统计表的结果是以党员为分组,将所有的活动前部已列的形式展示,统计每一个党员参与的各个活动的次数,没有参与为0次 

需要的最终统计结果预览如下

姓名支部名称活动1活动2活动3活动4
党员1党支部名称1111
党员2党支部名称0001
党员3党支部名称0002

表结构和数据

CREATE TABLE `t_party_event` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '党员活动名称',
  `event_time` datetime DEFAULT NULL COMMENT '活动时间',
  `user_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '党员名称',
  `branch_id` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '支部id',
  `branch_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '支部名称',
  `create_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='党员活动表';

INSERT INTO `oa-server`.`t_party_event` (`id`, `name`, `event_time`, `user_name`, `branch_id`, `branch_name`, `create_time`) VALUES ('1', '活动1', '2020-12-05 14:34:02', '党员1', '党支部id', '党支部名称', '2020-12-05 14:34:40');
INSERT INTO `oa-server`.`t_party_event` (`id`, `name`, `event_time`, `user_name`, `branch_id`, `branch_name`, `create_time`) VALUES ('2', '活动2', '2020-12-05 14:34:02', '党员1', '党支部id', '党支部名称', '2020-12-05 14:34:40');
INSERT INTO `oa-server`.`t_party_event` (`id`, `name`, `event_time`, `user_name`, `branch_id`, `branch_name`, `create_time`) VALUES ('3', '活动3', '2020-12-05 14:34:02', '党员1', '党支部id', '党支部名称', '2020-12-05 14:34:40');
INSERT INTO `oa-server`.`t_party_event` (`id`, `name`, `event_time`, `user_name`, `branch_id`, `branch_name`, `create_time`) VALUES ('4', '活动4', '2020-12-05 14:34:02', '党员2', '党支部id', '党支部名称', '2020-12-05 14:34:40');
INSERT INTO `oa-server`.`t_party_event` (`id`, `name`, `event_time`, `user_name`, `branch_id`, `branch_name`, `create_time`) VALUES ('5', '活动4', '2020-12-05 14:34:02', '党员1', '党支部id', '党支部名称', '2020-12-05 14:34:40');
INSERT INTO `oa-server`.`t_party_event` (`id`, `name`, `event_time`, `user_name`, `branch_id`, `branch_name`, `create_time`) VALUES ('6', '活动4', '2020-12-05 14:34:02', '党员3', '党支部id', '党支部名称', '2020-12-05 14:34:40');
INSERT INTO `oa-server`.`t_party_event` (`id`, `name`, `event_time`, `user_name`, `branch_id`, `branch_name`, `create_time`) VALUES ('7', '活动4', '2020-12-06 14:34:02', '党员3', '党支部id', '党支部名称', '2020-12-05 14:34:40');
 

sql编写过程

将党员的每次活动数量都统计出来

(党员的党支部名称即便重复也是正确的(因为即使党员名称不同,但有可能是一个支部),因为group by是将 user_name,branch_name,name三个字段为一个组来进行分组)

SELECT
    a.user_name,a.branch_name,a.`name`,count(a.id) as number
FROM
 t_party_event a 
GROUP BY
    a.user_name,a.branch_name,a.`name`
ORDER BY user_name

统计出来后,但是活动的名称是在一列的,想办法放为多个列,此处有一个问题是活动的名称是名称都已知的情况,如果名称为动态可变,则需要动态拼写sql

通过CASE WHEN 加MAX将所有的数量统计起来,并展示为多列

SELECT a.user_name '姓名',a.branch_name '支部名称',
max(CASE WHEN(a.name = '活动1') THEN number ELSE 0 END) '活动1',
max(CASE WHEN(a.name = '活动2') THEN number ELSE 0 END) '活动2',
max(CASE WHEN(a.name = '活动3') THEN number ELSE 0 END) '活动3',
max(CASE WHEN(a.name = '活动4') THEN number ELSE 0 END) '活动4'
FROM (
SELECT
	a.user_name,a.branch_name,a.`name`,count(a.id) as number
FROM
 t_party_event a 
GROUP BY
	a.user_name,a.branch_name,a.`name`
ORDER BY user_name
) a
GROUP BY a.user_name,a.branch_name

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值