在线精品99_中国九九盗摄偷拍偷看_91免费版在线观看_91.app_91高清视频在线_99热最新网站

mysql中的行列转换方法

97次阅读
没有评论

共计 3950 个字符,预计需要花费 10 分钟才能阅读完成。

这篇文章主要介绍“mysql 中的行列转换方法”,在日常操作中,相信很多人在 mysql 中的行列转换方法问题上存在疑惑,丸趣 TV 小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”mysql 中的行列转换方法”的疑惑有所帮助!接下来,请跟着丸趣 TV 小编一起来学习吧!

现整理解法如下:
数据样本:
create table tx(
 id int primary key,
 c1 char(2),
 c2 char(2),
 c3 int
);
insert into tx values
(1 , A1 , B1 ,9),
(2 , A2 , B1 ,7),
(3 , A3 , B1 ,4),
(4 , A4 , B1 ,2),
(5 , A1 , B2 ,2),
(6 , A2 , B2 ,9),
(7 , A3 , B2 ,8),
(8 , A4 , B2 ,5),
(9 , A1 , B3 ,1),
(10 , A2 , B3 ,8),
(11 , A3 , B3 ,8),
(12 , A4 , B3 ,6),
(13 , A1 , B4 ,8),
(14 , A2 , B4 ,2),
(15 , A3 , B4 ,6),
(16 , A4 , B4 ,9),
(17 , A1 , B4 ,3),
(18 , A2 , B4 ,5),
(19 , A3 , B4 ,2),
(20 , A4 , B4 ,5);
 
mysql select * from tx;
+—-+——+——+——+
| id | c1  | c2  | c3  |
+—-+——+——+——+
|  1 | A1  | B1  |  9 |
|  2 | A2  | B1  |  7 |
|  3 | A3  | B1  |  4 |
|  4 | A4  | B1  |  2 |
|  5 | A1  | B2  |  2 |
|  6 | A2  | B2  |  9 |
|  7 | A3  | B2  |  8 |
|  8 | A4  | B2  |  5 |
|  9 | A1  | B3  |  1 |
| 10 | A2  | B3  |  8 |
| 11 | A3  | B3  |  8 |
| 12 | A4  | B3  |  6 |
| 13 | A1  | B4  |  8 |
| 14 | A2  | B4  |  2 |
| 15 | A3  | B4  |  6 |
| 16 | A4  | B4  |  9 |
| 17 | A1  | B4  |  3 |
| 18 | A2  | B4  |  5 |
| 19 | A3  | B4  |  2 |
| 20 | A4  | B4  |  5 |
+—-+——+——+——+
20 rows in set (0.00 sec)
mysql
期望结果
+——+—–+—–+—–+—–+——+
|C1  |B1  |B2  |B3  |B4  |Total |
+——+—–+—–+—–+—–+——+
|A1  |9  |2  |1  |11  |23  |
|A2  |7  |9  |8  |7  |31  |
|A3  |4  |8  |8  |8  |28  |
|A4  |2  |5  |6  |14  |27  |
|Total |22  |24  |23  |40  |109  |
+——+—–+—–+—–+—–+——+
1. 利用 SUM(IF()) 生成列 + WITH ROLLUP 生成汇总行, 并利用 IFNULL 将汇总行标题显示为 Total
mysql SELECT
  –   IFNULL(c1, total) AS total,
  –   SUM(IF(c2= B1 ,c3,0)) AS B1,
  –   SUM(IF(c2= B2 ,c3,0)) AS B2,
  –   SUM(IF(c2= B3 ,c3,0)) AS B3,
  –   SUM(IF(c2= B4 ,c3,0)) AS B4,
  –   SUM(IF(c2= total ,c3,0)) AS total
  – FROM (
  –   SELECT c1,IFNULL(c2, total) AS c2,SUM(c3) AS c3
  –   FROM tx
  –   GROUP BY c1,c2
  –   WITH ROLLUP
  –   HAVING c1 IS NOT NULL
  – ) AS A
  – GROUP BY c1
  – WITH ROLLUP;
+——-+——+——+——+——+——-+
| total | B1  | B2  | B3  | B4  | total |
+——-+——+——+——+——+——-+
| A1  |  9 |  2 |  1 |  11 |  23 |
| A2  |  7 |  9 |  8 |  7 |  31 |
| A3  |  4 |  8 |  8 |  8 |  28 |
| A4  |  2 |  5 |  6 |  14 |  27 |
| total |  22 |  24 |  23 |  40 |  109 |
+——-+——+——+——+——+——-+
5 rows in set, 1 warning (0.00 sec)
2. 利用 SUM(IF()) 生成列 + UNION 生成汇总行, 并利用 IFNULL 将汇总行标题显示为 Total
mysql select c1,
  – sum(if(c2= B1 ,C3,0)) AS B1,
  – sum(if(c2= B2 ,C3,0)) AS B2,
  – sum(if(c2= B3 ,C3,0)) AS B3,
  – sum(if(c2= B4 ,C3,0)) AS B4,SUM(C3) AS TOTAL
  – from tx
  – group by C1
  – UNION
  – SELECT TOTAL ,sum(if(c2= B1 ,C3,0)) AS B1,
  – sum(if(c2= B2 ,C3,0)) AS B2,
  – sum(if(c2= B3 ,C3,0)) AS B3,
  – sum(if(c2= B4 ,C3,0)) AS B4,SUM(C3) FROM TX
  –
+——-+——+——+——+——+——-+
| c1  | B1  | B2  | B3  | B4  | TOTAL |
+——-+——+——+——+——+——-+
| A1  |  9 |  2 |  1 |  11 |  23 |
| A2  |  7 |  9 |  8 |  7 |  31 |
| A3  |  4 |  8 |  8 |  8 |  28 |
| A4  |  2 |  5 |  6 |  14 |  27 |
| TOTAL |  22 |  24 |  23 |  40 |  109 |
+——-+——+——+——+——+——-+
5 rows in set (0.00 sec)
mysql
 
3.  利用 SUM(IF()) 生成列, 直接生成结果不再利用子查询
mysql select ifnull(c1, total),
  – sum(if(c2= B1 ,C3,0)) AS B1,
  – sum(if(c2= B2 ,C3,0)) AS B2,
  – sum(if(c2= B3 ,C3,0)) AS B3,
  – sum(if(c2= B4 ,C3,0)) AS B4,SUM(C3) AS TOTAL
  – from tx
  – group by C1 with rollup ;
+——————–+——+——+——+——+——-+
| ifnull(c1, total) | B1  | B2  | B3  | B4  | TOTAL |
+——————–+——+——+——+——+——-+
| A1  |  9 |  2 |  1 |  11 |  23 |
| A2  |  7 |  9 |  8 |  7 |  31 |
| A3  |  4 |  8 |  8 |  8 |  28 |
| A4  |  2 |  5 |  6 |  14 |  27 |
| total  |  22 |  24 |  23 |  40 |  109 |
+——————–+——+——+——+——+——-+
5 rows in set (0.00 sec)
mysql

4. 动态,适用于列不确定情况,
mysql SET @EE=
mysql SELECT @EE:=CONCAT(@EE, SUM(IF(C2=\ ,C2, \ , ,C3,0)) AS ,C2, , ) FROM (SELECT DISTINCT C2 FROM TX) A;
 
mysql SET @QQ=CONCAT(SELECT ifnull(c1,\ total\), ,LEFT(@EE,LENGTH(@EE)-1), ,SUM(C3) AS TOTAL FROM TX GROUP BY C1 WITH ROLLUP
Query OK, 0 rows affected (0.00 sec)
mysql PREPARE stmt2 FROM @QQ;
Query OK, 0 rows affected (0.00 sec)
Statement prepared
mysql EXECUTE stmt2;
+——————–+——+——+——+——+——-+
| ifnull(c1, total) | B1  | B2  | B3  | B4  | TOTAL |
+——————–+——+——+——+——+——-+
| A1  |  9 |  2 |  1 |  11 |  23 |
| A2  |  7 |  9 |  8 |  7 |  31 |
| A3  |  4 |  8 |  8 |  8 |  28 |
| A4  |  2 |  5 |  6 |  14 |  27 |
| total  |  22 |  24 |  23 |  40 |  109 |
+——————–+——+——+——+——+——-+
5 rows in set (0.00 sec)
mysql

以上均由网友   liangCK , wwwwb , WWWWA , dap570 提供, 再次感谢他们的支持。
其实数据库中也可以用 CASE WHEN / DECODE  代替 IF

到此,关于“mysql 中的行列转换方法”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注丸趣 TV 网站,丸趣 TV 小编会继续努力为大家带来更多实用的文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-08-01发表,共计3950字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)
主站蜘蛛池模板: 美女被按在的视频网站观看 | 中国美女一级毛片 | 高潮迭起av乳颜射后入 | 免费色网 | 在线色网| 国内精品久久久久尤物 | 日韩欧美在线中文字幕 | 亚洲五月综合缴情在线观看 | 精品高潮呻吟99av无码视频 | 好吊色欧美一区二区三区视频 | 日韩夜夜高潮夜夜爽无码 | 国产欧美日韩在线不卡第一页 | 日本少妇人妻xxxxx18 | 亚州精品视频 | 美女张开腿让男人桶 | 99久久精品国产自免费 | 小说区图片区综合久久亚洲 | 黄色一级一毛片 | 久久精品久久久久观看99水蜜桃 | 国产成人综合欧美精品久久 | 国产精品亚洲欧美大片在线看 | 国产国语特级一级aa毛片 | 久久欧美精品欧美九久欧美 | 日韩中文字幕在线免费观看 | 国产片一区二区三区 | 国产农村精品一级毛片视频 | 欧美特黄一级大黄录像 | 亚洲乱码在线 | 亚洲激情中文字幕 | 成人午夜影视 | 老司机69精品成免费视频 | 精品国产av一区二区三区 | 一区二区三区网站在线免费线观看 | 久久精品亚瑟全部免费观看 | 一个人看的www免费观看视频 | 亚洲av乱码久久精品蜜桃 | 一二三四视频6+1在线观看免费 | 亚洲av综合色区无码一区爱av | 青青青在线观看国产精品 | 免费激情网址 | 182福利视频在线观看黄 |