sql 行轉列 列轉行 總結

 

 

 

 

 

 

1、CONCAT()函數git

concat() 函數用於將多個字符串鏈接成一個字符串。函數

一、語法及使用特色:spa

CONCAT(str1,str2,…) 
返回結果爲鏈接參數產生的字符串。若有任何一個參數爲NULL ,則返回值爲 NULL。能夠有一個或多個參數。

 

二、使用示例:code

 

 

使用函數concat_ws().blog

語法爲: concat_ws(separator,str1,str2,......)字符串

concat_ws() 表明concat with separator, 是 concat()的特殊形式,第一個參數是分隔符。分隔符的位置放在要鏈接的兩個字符串之間。分隔符能夠是一個字符串,也能夠是其它參數。若是分隔符爲 NULL,則結果爲 NULL。函數會忽略任何分隔符參數後的 NULL 值。可是CONCAT_WS()不會忽略任何空字符串。 (然而會忽略全部的 NULL)。it

如SELECT CONCAT_WS('_',id,name) AS con_ws FROM info LIMIT 1;返回結果爲

+----------+
| con_ws   |
+----------+
| 1_BioCyc |
+----------+
SELECT CONCAT_WS(',','First name',NULL,'Last Name');返回結果爲

| CONCAT_WS(',','First name',NULL,'Last Name') |io

3、group_concat()函數

前言:在有group by的查詢語句中,select指定的字段要麼就包含在group by語句的後面,做爲分組的依據,要麼就包含在聚合函數中。ast

例5:查詢該數據並根據性別分組:test

select sex, id, username from my_test group by sex;

 

根據性別分組以後,想知道每一個分組裏面都有哪些數據,那怎麼辦啊? ——使用group_concat()

例6:查詢數據分組並獲取每一個組別中詳細的數據:

 

三、使用SUBSTRING_INDEX和CROSS JOIN將列裏面的的數字都拆分出來,把一行變成一列。

方法一(網上查詢的方法):

建配置表:

複製代碼

複製代碼

CREATE TABLE digits (digit INT(1));
    INSERT INTO digits
    VALUES
        (0),
        (1),
        (2),
        (3),
        (4),
        (5),
        (6),
        (7),
        (8),
        (9);
    CREATE TABLE sequence (seq INT(3));
    INSERT INTO sequence (
        SELECT
            D1.digit + D2.digit * 10
        FROM
            digits D1
        CROSS JOIN digits D2
    );

複製代碼

複製代碼

配置表sequence的結果爲0-99的一列數字:

SQL:

複製代碼

複製代碼

SELECT
    SUBSTRING_INDEX(
        SUBSTRING_INDEX(JoinEventIds, ',', seq),
        ',' ,- 1
    ) JoinEventIds
FROM
    sequence
CROSS JOIN user
WHERE
    seq BETWEEN 1
AND (
    SELECT
        1 + LENGTH(JoinEventIds) - LENGTH(
            REPLACE (JoinEventIds, ',', '')
        )
)

複製代碼

複製代碼

方法二(本身不想建表,圖省事):將sequence替換爲SELECT @rownum:=@rownum+1 AS seq FROM (SELECT @rownum:=0) r, user  LIMIT 0,100) ,user爲表名,這張表須要大於100條。

複製代碼

複製代碼

SELECT  SUBSTRING_INDEX(
            SUBSTRING_INDEX(JoinEventIds, ',', seq),
            ',' ,- 1
        ) JoinEventIds
    FROM
        (SELECT @rownum:=@rownum+1 AS seq FROM (SELECT @rownum:=0) r, user  LIMIT 0,100) b
    CROSS JOIN user
    WHERE
        seq BETWEEN 1
    AND (
        SELECT
            1 + LENGTH(JoinEventIds) - LENGTH(REPLACE(JoinEventIds, ',', '')))

複製代碼

複製代碼

兩種方法結果均爲:

相關文章
相關標籤/搜索