Mysql 行转列,列转行

CREATE TABLE `StudentScores` (
  `UserName` varchar(20) DEFAULT NULL,
  `Subject` varchar(30) DEFAULT NULL,
  `Score` float DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO StudentScores SELECT 'Nick', '语文', 80;
INSERT INTO StudentScores SELECT 'Nick', '数学', 90;
INSERT INTO StudentScores SELECT 'Nick', '英语', 70;
INSERT INTO StudentScores SELECT 'Nick', '生物', 85;
INSERT INTO StudentScores SELECT 'Kent', '语文', 80;
INSERT INTO StudentScores SELECT 'Kent', '数学', 90;
INSERT INTO StudentScores SELECT 'Kent', '英语', 70;
INSERT INTO StudentScores SELECT 'Kent', '生物', 85;

如果我想知道每位学生的每科成绩,而且每个学生的全部成绩排成一行,这样方便我查看、统计,导出数据

SELECT
      UserName,
      MAX(CASE Subject WHEN '语文' THEN Score ELSE 0 END) AS '语文',
      MAX(CASE Subject WHEN '数学' THEN Score ELSE 0 END) AS '数学',
      MAX(CASE Subject WHEN '英语' THEN Score ELSE 0 END) AS '英语',
      MAX(CASE Subject WHEN '生物' THEN Score ELSE 0 END) AS '生物'
FROM StudentScores
GROUP BY UserName

查询结果如图所示,这样我们就能很清楚的了解每位学生所有的成绩了


 
 
CREATE TABLE Inpours
(
   ID           INT ,
   UserName         NVARCHAR(20),  --游戏玩家
   CreateTime       DATETIME,      --充值时间    
   PayType          NVARCHAR(20),  --充值类型    
   Money           DECIMAL,       --充值金额
   IsSuccess         BIT,           --是否成功 1表示成功, 0表示失败
   CONSTRAINT PK_Inpours_ID PRIMARY KEY(ID)
)


INSERT INTO Inpours SELECT '1','张三', '2010-05-01', '支付宝', 50, 1;
INSERT INTO Inpours SELECT '2','张三', '2010-06-14', '支付宝', 50, 1;
INSERT INTO Inpours SELECT '3','张三', '2010-06-14', '手机短信', 100, 1;
INSERT INTO Inpours SELECT '4','李四', '2010-06-14', '手机短信', 100, 1;
INSERT INTO Inpours SELECT '5','李四', '2010-07-14', '支付宝', 100, 1;
INSERT INTO Inpours SELECT '6','王五', '2010-07-14', '工商银行卡', 100, 1;
INSERT INTO Inpours SELECT '7','赵六', '2010-07-14', '建设银行卡', 100, 1;

下面来了一个统计数据的需求,要求按日期、支付方式来统计充值金额信息。这也是一个典型的行转列的例子。我们可以通过下面的脚本来达到目的

SELECT  CreateTime,
       CASE PayType WHEN '支付宝'     THEN SUM(Money) ELSE 0 END AS '支付宝',
 
       CASE PayType WHEN '手机短信'    THEN SUM(Money) ELSE 0 END AS '手机短信',
 
       CASE PayType WHEN '工商银行卡'  THEN SUM(Money) ELSE 0 END AS '工商银行卡',
 
       CASE PayType WHEN '建设银行卡'  THEN SUM(Money) ELSE 0 END AS '建设银行卡'
 
FROM Inpours
 
GROUP BY CreateTime, PayType

其实行转列,关键是要理清逻辑,而且对分组(Group by)概念比较清晰。

2、列转行

CREATE TABLE `TEST_TB_GRADE2` (
  `ID` int(10) NOT NULL AUTO_INCREMENT,
  `USER_NAME` varchar(20) DEFAULT NULL,
  `CN_SCORE` float DEFAULT NULL,
  `MATH_SCORE` float DEFAULT NULL,
  `EN_SCORE` float DEFAULT '0',
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

insert into TEST_TB_GRADE2(USER_NAME, CN_SCORE, MATH_SCORE, EN_SCORE) values
("张三", 34, 58, 58),
("李四", 45, 87, 45),
("王五", 76, 34, 89);
select user_name, '语文' COURSE , CN_SCORE as SCORE from TEST_TB_GRADE2
union select user_name, '数学' COURSE, MATH_SCORE as SCORE from TEST_TB_GRADE2
union select user_name, '英语' COURSE, EN_SCORE as SCORE from TEST_TB_GRADE2
order by user_name,COURSE;


猜你喜欢

转载自blog.csdn.net/qy844083265/article/details/80734390