最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SQL行列轉(zhuǎn)置以及非常規(guī)的行列轉(zhuǎn)置示例代碼

 更新時間:2024年08月17日 10:22:53   作者:yangjiwei0207  
轉(zhuǎn)置即旋轉(zhuǎn)數(shù)據(jù)表的橫縱方向,常用來改變數(shù)據(jù)布局,以便用新的角度觀察,下面這篇文章主要給大家介紹了關(guān)于SQL行列轉(zhuǎn)置以及非常規(guī)行列轉(zhuǎn)置的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下

一、準備工作

# 創(chuàng)建數(shù)據(jù)表
CREATE TABLE ChengJi
(
    Name    varchar(32),
    Subject varchar(32),
    Result  int(10)
);

# 插入數(shù)據(jù)
insert into ChengJi
values ('張三', '語文', 80),
       ('張三', '數(shù)學(xué)', 90),
       ('張三', '物理', 85),
       ('李四', '語文', 85),
       ('李四', '數(shù)學(xué)', 92),
       ('李四', '物理', 82);

二、行轉(zhuǎn)列

整體分兩步走

1、先預(yù)處理數(shù)據(jù),將數(shù)據(jù)進行初步的行轉(zhuǎn)列,便于后續(xù)的分組處理

select Name,
       case
            when Subject = '語文' then Result else 0
       end as 'Chinese',
       case
           when Subject = '數(shù)學(xué)' then Result else 0
       end as 'Math',
       case
           when Subject = '物理' then Result else 0
       end as 'Pha'
from ChengJi;

2、對預(yù)處理完畢的數(shù)據(jù)進行分組聚合,使多行數(shù)據(jù)匯聚到一個組內(nèi),達到數(shù)據(jù)集中的結(jié)果,這其中要注意的一點是:要明確按照哪個字段進行聚合操作。

with t1 as(select Name,
       case
            when Subject = '語文' then Result else 0
       end as 'Chinese',
       case
           when Subject = '數(shù)學(xué)' then Result else 0
       end as 'Math',
       case
           when Subject = '物理' then Result else 0
       end as 'Pha'
from ChengJi)
select Name,
       sum(Chinese) as 'Chinese',
       sum(Math) as 'Math',
       sum(Pha) as 'Pha'
from t1
group by Name;

三、列轉(zhuǎn)行

為便于理解,我們將剛才已經(jīng)轉(zhuǎn)置好的結(jié)果插入到一個結(jié)果表內(nèi)

1、創(chuàng)建一個結(jié)果表

create table ChengJi_2(
    Name varchar(255),
    Chinese int,
    Math int,
    Pha int
);

2、將行轉(zhuǎn)列結(jié)果插入到結(jié)果表

insert into chengji_2
with t1 as(select Name,
       case
            when Subject = '語文' then Result else 0
       end as 'Chinese',
       case
           when Subject = '數(shù)學(xué)' then Result else 0
       end as 'Math',
       case
           when Subject = '物理' then Result else 0
       end as 'Pha'
from ChengJi)
select Name,
       sum(Chinese) as 'Chinese',
       sum(Math) as 'Math',
       sum(Pha) as 'Pha'
from t1
group by Name
;

3、對結(jié)果表進行列轉(zhuǎn)行的操作,列轉(zhuǎn)行相對于行轉(zhuǎn)列較為簡單,可直接使用 union all 進行操作。

select Name,Chinese from ChengJi_2
union all
select Name,Math from ChengJi_2
union all
select Name,Pha from ChengJi_2;

四、特殊的列轉(zhuǎn)行/行轉(zhuǎn)列

但是對于一些特殊的行列轉(zhuǎn)置,以上方法就不再使用,通常情況下,我們的行列轉(zhuǎn)置是有可以進行分組聚合操作可以完成的,而生產(chǎn)實踐中也多數(shù)如此,但是有時有一些特殊的操作是以上方法無法完成的,這就需要一些特殊的行列轉(zhuǎn)置來完成,對此,我給出了以下的方案。

1、準備工作,創(chuàng)建數(shù)據(jù)表并插入數(shù)據(jù)

CREATE TABLE 2003a
(
    seat   varchar(255) ,
    status varchar(255) ,
    rowid  varchar(255)
)
;

INSERT INTO 2003a
VALUES ('2', '已預(yù)訂', 'A');
INSERT INTO 2003a
VALUES ('3', '未預(yù)訂', 'A');
INSERT INTO 2003a
VALUES ('4', '未預(yù)訂', 'A');
INSERT INTO 2003a
VALUES ('5', '未預(yù)訂', 'A');
INSERT INTO 2003a
VALUES ('6', '未預(yù)訂', 'B');
INSERT INTO 2003a
VALUES ('7', '未預(yù)訂', 'B');
INSERT INTO 2003a
VALUES ('8', '未預(yù)訂', 'B');
INSERT INTO 2003a
VALUES ('9', '未預(yù)訂', 'B');
INSERT INTO 2003a
VALUES ('10', '未預(yù)訂', 'B');
INSERT INTO 2003a
VALUES ('11', '未預(yù)訂', 'C');
INSERT INTO 2003a
VALUES ('12', '已預(yù)訂', 'C');
INSERT INTO 2003a
VALUES ('13', '已預(yù)訂', 'C');
INSERT INTO 2003a
VALUES ('14', '未預(yù)訂', 'C');
INSERT INTO 2003a
VALUES ('15', '未預(yù)訂', 'C');
INSERT INTO 2003a
VALUES ('16', '未預(yù)訂', 'D');
INSERT INTO 2003a
VALUES ('17', '未預(yù)訂', 'D');
INSERT INTO 2003a
VALUES ('18', '未預(yù)訂', 'D');
INSERT INTO 2003a
VALUES ('19', '未預(yù)訂', 'D');
INSERT INTO 2003a
VALUES ('20', '已預(yù)訂', 'D');

2、明確需求

原有表的結(jié)構(gòu):

2,已預(yù)訂,A
3,未預(yù)訂,A

需要完成的工作:

2,3
已預(yù)定,未預(yù)定
A,A

在這里我們可以很明顯的看出,我們需要做的就是如何進行 行轉(zhuǎn)列/列轉(zhuǎn)行 的操作,在這里的行列轉(zhuǎn)置是整行/整列進行轉(zhuǎn)置,不再是依靠某個字段進行分組處理或者使用 union all 進行整體操作,因此,我是用以下方案來完成。

1、對原表字段進行 group_concat,指定 “,”為字段值之間的分隔符

SELECT
                GROUP_CONCAT(rowid ORDER BY rowid ASC SEPARATOR ', ') AS rowid,
                GROUP_CONCAT(status ORDER BY rowid ASC SEPARATOR ', ') AS status,
                GROUP_CONCAT(seat ORDER BY rowid ASC SEPARATOR ', ') AS seat
            FROM (
                     SELECT rowid, status, seat from `2003a`
                 ) AS subquery

2、將所有的字段按照值聚合到一個數(shù)據(jù)表格內(nèi)之后,我們可以使用 union all 來進行字段拆分

with t1 as (SELECT
                GROUP_CONCAT(rowid ORDER BY rowid ASC SEPARATOR ', ') AS rowid,
                GROUP_CONCAT(status ORDER BY rowid ASC SEPARATOR ', ') AS status,
                GROUP_CONCAT(seat ORDER BY rowid ASC SEPARATOR ', ') AS seat
            FROM (
                     SELECT rowid, status, seat from `2003a`
                 ) AS subquery)
select seat from t1
union all
select status from t1
union all
select rowid from t1

3、使用 SUBSTRING_INDEX來進行拆分,將所有的字段值拆分成單獨的值

with t1 as (SELECT
                GROUP_CONCAT(rowid ORDER BY rowid ASC SEPARATOR ', ') AS rowid,
                GROUP_CONCAT(status ORDER BY rowid ASC SEPARATOR ', ') AS status,
                GROUP_CONCAT(seat ORDER BY rowid ASC SEPARATOR ', ') AS seat
            FROM (
                     SELECT rowid, status, seat from `2003a`
                 ) AS subquery)
,t2 as (select seat from t1
union all
select status from t1
union all
select rowid from t1)
select SUBSTRING_INDEX(seat,',',1) as p1,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',2),',',-1) as p2,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',3),',',-1) as p3,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',4),',',-1) as p4,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',5),',',-1) as p5,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',6),',',-1) as p6,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',7),',',-1) as p7,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',8),',',-1) as p8,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',9),',',-1) as p9,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',10),',',-1) as p10,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',11),',',-1) as p11,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',12),',',-1) as p12,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',13),',',-1) as p13,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',14),',',-1) as p14,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',15),',',-1) as p15,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',16),',',-1) as p16,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',17),',',-1) as p17,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',18),',',-1) as p18,
       SUBSTRING_INDEX(SUBSTRING_INDEX(seat,',',19),',',-1) as p19
from t2

在這里需要注意的是:第一個SUBSTRING_INDEX我們?nèi)〉氖窃磾?shù)據(jù)的第一個值,第二個SUBSTRING_INDEX以及之后的,我們?nèi)〉檬窃磾?shù)據(jù)的倒數(shù)第一個值,因此這里需要注意一下我們給到的是“-1”

至此,我們使用group_concat()以及SUBSTRING_INDEX()來達到了特殊的行列轉(zhuǎn)置操作。

總結(jié) 

到此這篇關(guān)于SQL行列轉(zhuǎn)置以及非常規(guī)的行列轉(zhuǎn)置的文章就介紹到這了,更多相關(guān)SQL行列轉(zhuǎn)置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL讀寫分離部署實踐

    MySQL讀寫分離部署實踐

    文章介紹了如何配置和使用ProxySQL進行MySQL主從復(fù)制集群的部署,包括環(huán)境準備、安裝ProxySQL、配置主從服務(wù)器、設(shè)置讀寫分離、用戶認證、監(jiān)控和性能優(yōu)化等步驟
    2026-01-01
  • 解決MySQL安裝第四步報錯問題(initializing database(may take a long time)

    解決MySQL安裝第四步報錯問題(initializing database(may take&nb

    安裝MySQL時遇到中文計算機名導(dǎo)致的亂碼問題,解決方法是修改my.ini配置文件中的相關(guān)設(shè)置,如果問題仍然存在,需要徹底卸載并刪除所有相關(guān)文件,然后將計算機名改為英文,重新安裝MySQL
    2025-12-12
  • MySQL Slave 觸發(fā) oom-killer解決方法

    MySQL Slave 觸發(fā) oom-killer解決方法

    這篇文章主要介紹了MySQL Slave 觸發(fā) oom-killer解決方法,需要的朋友可以參考下
    2016-07-07
  • 解決MySQL報錯incorrect?datetime?value?'0000-00-00?00:00:00'?for?column

    解決MySQL報錯incorrect?datetime?value?'0000-00-00?00:00

    這篇文章主要給大家介紹了關(guān)于如何解決MySQL報錯incorrect?datetime?value?'0000-00-00?00:00:00'?for?column的相關(guān)資料,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-08-08
  • MySql 空間索引的實現(xiàn)

    MySql 空間索引的實現(xiàn)

    MySQL空間索引是一種用于優(yōu)化地理空間數(shù)據(jù)查詢的數(shù)據(jù)結(jié)構(gòu),通過為幾何數(shù)據(jù)類型創(chuàng)建空間索引,可以高效地對空間數(shù)據(jù)進行查詢和操作,感興趣的可以了解一下
    2024-11-11
  • 一文整理新手最常犯的SQL高頻語法錯誤和避坑合集

    一文整理新手最常犯的SQL高頻語法錯誤和避坑合集

    本文整理了SQL新手常見的10類語法錯誤,包括基礎(chǔ)語法錯誤,CRUD操作錯誤,查詢類錯誤等,每個錯誤都提供錯誤示例、正確寫法及避坑技巧,希望對大家有所幫助
    2026-05-05
  • MySQL中的連接查詢使用方式

    MySQL中的連接查詢使用方式

    文章介紹了MySQL中的連接查詢(JOIN),包括INNER?JOIN、LEFT?JOIN、RIGHT?JOIN和FULL?JOIN(通過UNION實現(xiàn)),通過示例和解釋,文章說明了連接查詢在數(shù)據(jù)規(guī)范化、提高查詢效率和滿足復(fù)雜查詢需求方面的應(yīng)用
    2025-11-11
  • MySQL快速復(fù)制一張表的四種核心方法(包括表結(jié)構(gòu)和數(shù)據(jù))

    MySQL快速復(fù)制一張表的四種核心方法(包括表結(jié)構(gòu)和數(shù)據(jù))

    本文詳細介紹了四種復(fù)制MySQL表(結(jié)構(gòu)+數(shù)據(jù))的方法,并對每種方法進行了對比分析,適用于不同場景和數(shù)據(jù)量的復(fù)制需求,特別是針對超大表(1億+行)和跨實例復(fù)制提供了具體的操作命令和注意事項,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • Mysql中的NULL和Empty String

    Mysql中的NULL和Empty String

    這篇文章主要介紹了Mysql中的NULL和Empty String知識,需要的朋友可以參考下
    2017-12-12
  • linux下mysql 5.1 和 5.7的安裝教程

    linux下mysql 5.1 和 5.7的安裝教程

    下面小編就為大家分享一篇linux下mysql 5.1 和 5.7的安裝教程,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2017-12-12

最新評論

桃园市| 镇江市| 鄄城县| 横峰县| 耒阳市| 双鸭山市| 平山县| 浦东新区| 五华县| 凤阳县| 宜黄县| 永胜县| 上犹县| 电白县| 旬阳县| 中方县| 兴宁市| 大港区| 龙山县| 宁德市| 清徐县| 蓝田县| 武义县| 高陵县| 海原县| 莒南县| 黑山县| 达州市| 抚松县| 沾化县| 保定市| 静乐县| 平定县| 聂拉木县| 湘潭市| 灵武市| 邯郸县| 交口县| 高淳县| 巫山县| 静安区|