<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        MySQL交叉表實現分享_MySQL

        來源:懂視網 責編:小采 時間:2020-11-09 19:01:14
        文檔

        MySQL交叉表實現分享_MySQL

        MySQL交叉表實現分享_MySQL:bitsCN.com 現整理解法如下: 數據樣本: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
        推薦度:
        導讀MySQL交叉表實現分享_MySQL:bitsCN.com 現整理解法如下: 數據樣本: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

        bitsCN.com 現整理解法如下:

        數據樣本:

        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

        bitsCN.com

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        MySQL交叉表實現分享_MySQL

        MySQL交叉表實現分享_MySQL:bitsCN.com 現整理解法如下: 數據樣本: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
        推薦度:
        標簽: 樣本 mysql 交叉表
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 美女被爆羞羞网站在免费观看| 亚洲AV人人澡人人爽人人夜夜| jiz zz在亚洲| 亚洲国产精品热久久| 久久久久免费精品国产| 国产成人亚洲精品青草天美| av永久免费网站在线观看| 国产免费不卡v片在线观看| 亚洲一区二区精品视频| jizz日本免费| 亚洲高清在线观看| 四虎在线成人免费网站| 亚洲三级高清免费| 日本一道本高清免费| 香港经典a毛片免费观看看| AV在线亚洲男人的天堂| 伊人免费在线观看| 亚洲美女自拍视频| 狠狠躁狠狠爱免费视频无码| 亚洲情XO亚洲色XO无码| 久久午夜夜伦鲁鲁片免费无码 | a高清免费毛片久久| 中文字幕精品亚洲无线码二区| a毛片免费全部播放完整成| 久久精品国产亚洲香蕉| 最近免费中文字幕mv在线电影| 亚洲xxxx视频| 狠狠综合久久综合88亚洲| 日本在线看片免费| 亚洲视频在线观看2018| 亚洲国产成人久久综合碰| 免费成人高清在线视频| 中文字幕无码亚洲欧洲日韩| 亚洲A丁香五香天堂网 | 搡女人免费视频大全| 亚洲视频在线观看免费视频| 卡一卡二卡三在线入口免费| 中文字幕高清免费不卡视频| 亚洲不卡在线观看| 国产亚洲精久久久久久无码77777 国产亚洲精品成人AA片新蒲金 | 妇女自拍偷自拍亚洲精品|