java笔试题系列一:MySQL行转列 (列值转成列名)

需求:

描述:用户表,统一不同地区的客户总数,以及客户星级分布情况。

1.客户信息表如下:
在这里插入图片描述
写一段sql,统计数据要求如下
在这里插入图片描述

1.准备mysql数据

CREATE TABLE `t_user_info` (
  `F_ID` int(10) NOT NULL,
  `F_NAME` varchar(100) DEFAULT NULL COMMENT '客户名称',
  `F_STAR` varchar(10) DEFAULT NULL COMMENT '星级',
  `F_CITY` varchar(100) DEFAULT NULL COMMENT '城市',
  PRIMARY KEY (`F_ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `t_user_info`(`F_ID`, `F_NAME`, `F_STAR`, `F_CITY`) VALUES (1, 'A', '1星', '上海');
INSERT INTO `t_user_info`(`F_ID`, `F_NAME`, `F_STAR`, `F_CITY`) VALUES (2, 'B', '2星', '上海');
INSERT INTO `t_user_info`(`F_ID`, `F_NAME`, `F_STAR`, `F_CITY`) VALUES (3, 'C', '1星', '北京');
INSERT INTO `t_user_info`(`F_ID`, `F_NAME`, `F_STAR`, `F_CITY`) VALUES (4, 'D', '2星', '广州');

分析题目

统计出每个地点的客户数量,以及每个星级的数量。客户星级为客户中的星级列的数据,要求统计结果为,将星级列转成的行。

固定星级的解决方法

mysql 函数学习

CASE expression
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
   ...
    WHEN conditionN THEN resultN
    ELSE result
END

函数描述:
CASE 表示函数开始,END 表示函数结束。如果 condition1 成立,则返回 result1, 如 果 condition2 成立,则返回 result2,当全部不成立则返回 result,而当有一个成立之后,后面的就不执行了。

SELECT
	F_CITY '地区',
	count( 1 ) '客户数量',
	sum( CASE F_STAR WHEN '1星' THEN 1 ELSE 0 END) '1星数量',
    sum( CASE F_STAR WHEN '2星' THEN 1 ELSE 0 END) '2星数量' 
		FROM
			t_user_info 
	GROUP BY
	F_CITY;

自定义星级的解决办法

使用sql查出自定义星级的字段,用户拼接查询后显示结果字段

SELECT DISTINCT
	GROUP_CONCAT(
			DISTINCT CONCAT( 
			 "sum( case F_STAR when '",
			  F_STAR, 
			  "' then 1 else 0 end) '", 
			  F_STAR, 
			  "数量'"
			 )
		 )
FROM
	t_user_info 

执行结果如下图:在这里插入图片描述
将查询sql拼接

SET @sql = NULL;
SELECT DISTINCT
	GROUP_CONCAT(
	  DISTINCT CONCAT( 
	 "sum( case F_STAR when '", F_STAR, 
	  "' then 1 else 0 end) '", F_STAR, "数量'"
	 )) INTO @sql
FROM
	t_user_info ;
 
SET @sql = CONCAT('select F_CITY "地区", count(1) "客户数量", ',
					         @sql, 
                  ' FROM t_user_info  GROUP BY F_CITY');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

执行sql结果:
在这里插入图片描述
添加自定星级sql

INSERT `t_user_info`(`F_ID`, `F_NAME`, `F_STAR`, `F_CITY`) VALUES (5, 'E', '3星', '三亚');

执行查询自定义星级的sql,获取结果为下图:
在这里插入图片描述
tony老师认证:此题目已攻克。
---- 理发界的扫地僧,编程界的泥石流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值