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;
?
總結
以上是生活随笔為你收集整理的Mysql 行转列,列转行的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 机器学习笔记(九)——决策树的生成与剪枝
- 下一篇: secureCRT 保存启动信息