天天看點

SQL 列轉行、行轉列 - 使用sqlite示範

一 列轉行

SQL 列轉行、行轉列 - 使用sqlite示範
SQL 列轉行、行轉列 - 使用sqlite示範
CREATE TABLE test1(
   ID INT PRIMARY KEY     NOT NULL,
   NAME           VARCHAR(50)    NOT NULL,
   國文 INT,
   數學 INT,
   英語 INT
);

insert into test1 values (1,'張飛',80,90,100);
insert into test1 values (2,'趙飛燕',100,90,80);

SELECT
    NAME,
    '國文' AS subject ,
    MAX("國文") AS score
FROM test1 GROUP BY NAME
UNION
SELECT
    NAME,
    '數學' AS subject ,
    MAX("數學") AS score
FROM test1 GROUP BY NAME
UNION
SELECT
    NAME,
    '英語' AS subject ,
    MAX("英語") AS score
FROM test1 GROUP BY NAME
           

使用如上SQL就對了;下面是網上的,

select *

from (select sname,[Course ] ='數學',[Score]=[數學] from Tb_students union all

select sname,[Course]='英語',[Score]=[英語] from Tb_students union all

select sname,[Course]='國文',[Score]=[國文] from Tb_students)t

order by sname,case [Course] when '國文' then 1 when '數學' then 2 when '英語' then 3 end

有些問題;

參閱

https://www.cnblogs.com/injet/p/10885478.html

二 行轉列

CREATE TABLE test2(
   NAME           VARCHAR(50)    NOT NULL,
   subject varchar(50),
   score int
);

insert into test2 values ('小明','國文',96);
insert into test2 values ('小明','數學',98);
insert into test2 values ('小明','英語',95);
insert into test2 values ('大花','國文',92);
insert into test2 values ('大花','數學',96);
insert into test2 values ('大花','英語',98);

SELECT name,
  MAX(
  CASE
    WHEN subject='國文'
    THEN score
    ELSE 0
  END) AS "國文",
  MAX(
  CASE
    WHEN subject='數學'
    THEN score
    ELSE 0
  END) AS "數學",
  MAX(
  CASE
    WHEN subject='英語'
    THEN score
    ELSE 0
  END) AS "英語"
FROM test2
GROUP BY name
           
SQL 列轉行、行轉列 - 使用sqlite示範
SQL 列轉行、行轉列 - 使用sqlite示範

使用SQLITE;

SQL 列轉行、行轉列 - 使用sqlite示範

三 PIVOT

如果是SQL Server 則可使用PIVOT 和 UNPIVOT;

PIVOT 和 UNPIVOT 關系運算符将表值表達式更改為另一個表。

PIVOT 通過将表達式某一列中的唯一值轉換為輸出中的多個列來旋轉表值表達式,并在必要時對最終輸出中所需的任何其餘列值執行聚合。

文法形式:     

SELECT 

<非透視的列>, [第一個透視的列] AS <列名稱>,[第二個透視的列] AS <列名稱>,...[最後一個透視的列] AS <列名稱>,

FROM

(<生成資料的 SELECT 查詢>) AS <源查詢的别名>

PIVOT

(

<聚合函數>(<要聚合的列>)

FOR

[<包含要成為列标題的值的列>]

IN ( [第一個透視的列], [第二個透視的列],... [最後一個透視的列])

) AS <透視表的别名>

<可選的 ORDER BY 子句>

SELECT *

FROM student

PIVOT (

    SUM(score) FOR subject IN (國文, 數學, 英語)

)

SELECT *

FROM student1

UNPIVOT (

    score FOR subject IN ("國文","數學","英語")

)