• <fieldset id="8imwq"><menu id="8imwq"></menu></fieldset>
  • <bdo id="8imwq"><input id="8imwq"></input></bdo>
    最新文章專題視頻專題問答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 20:11:24
    文檔

    MySQL交叉表_MySQL

    MySQL交叉表_MySQL:在某些數據庫中有交叉表,但在MySQL中卻沒有這個功能,但網上看到有不少朋友想找出一個解決方法,特發貼集思廣義。http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4cf5-bc1a-e8914aaee5ab.html96198現整理解法如下:數據樣本:cr
    推薦度:
    導讀MySQL交叉表_MySQL:在某些數據庫中有交叉表,但在MySQL中卻沒有這個功能,但網上看到有不少朋友想找出一個解決方法,特發貼集思廣義。http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4cf5-bc1a-e8914aaee5ab.html96198現整理解法如下:數據樣本:cr

    在某些數據庫中有交叉表,但在MySQL中卻沒有這個功能,但網上看到有不少朋友想找出一個解決方法,特發貼集思廣義。
    http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4cf5-bc1a-e8914aaee5ab.html?96198
    現整理解法如下:

    數據樣本:

    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>

    其實數據庫中也可以用 CASE WHEN / DECODE 代替 IF

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

    文檔

    MySQL交叉表_MySQL

    MySQL交叉表_MySQL:在某些數據庫中有交叉表,但在MySQL中卻沒有這個功能,但網上看到有不少朋友想找出一個解決方法,特發貼集思廣義。http://topic.csdn.net/u/20090530/23/0b782674-4b0b-4cf5-bc1a-e8914aaee5ab.html96198現整理解法如下:數據樣本:cr
    推薦度:
    • 熱門焦點

    最新推薦

    猜你喜歡

    熱門推薦

    專題
    Top
    主站蜘蛛池模板: 91探花国产综合在线精品| 香蕉国产精品频视| 国产精品一区在线播放| 麻豆精品视频在线观看91| 国产精品18久久久久久vr| 亚洲欧美日韩国产精品影院| 91久久精品无码一区二区毛片| 无码精品一区二区三区在线 | 久久精品夜色噜噜亚洲A∨| 无码精品久久久久久人妻中字| 国产精品毛片a∨一区二区三区| 国产精品无码日韩欧| 亚洲AV无码成人精品区天堂| 久久国产乱子伦精品免费午夜| 2021国产精品视频网站| 国产成人精品精品欧美 | 欧美人与动牲交a欧美精品| 国产成人精品高清不卡在线| 99久久国语露脸精品国产| 国产麻豆精品一区二区三区v视界 国产麻豆一精品一AV一免费 | 精品精品国产高清a毛片| 99re只有精品8中文| 日韩精品免费在线视频| 2022精品天堂在线视频| 国产成人精品2021| 国产精品区一区二区三在线播放| 无码日韩人妻精品久久蜜桃 | 久久夜色精品国产www| 精品国产午夜福利在线观看| 办公室久久精品| 国产精品.XX视频.XXTV| 国产L精品国产亚洲区久久 | 精品一区二区三区免费观看| 国产韩国精品一区二区三区| 国产成人AV无码精品| 精品无码国产污污污免费网站国产 | 久久精品国内一区二区三区| 国产偷亚洲偷欧美偷精品| 国产韩国精品一区二区三区久久| 国产成人精品一区二区秒拍 | 国产精品久久午夜夜伦鲁鲁|