SQL 操作列轉行查詢
阿新 • • 發佈:2019-01-01
題目: 如下一張學生成績表(tb_score)
```
t_name t_course t_score
小明 語文 90
小明 數學 87
小明 英語 85
小紅 語文 92
小紅 數學 89
小紅 英語 95
```
要求,寫出合理的sql語句,得到下面的結果
```
姓名 語文 數學 英語
小明 90 87 85
小紅 92 89 95
```
解答: 測試環境 Postgres (摯愛)
1) 建表
set SEARCH_PATH to public;
-- SCRIPTS
CREATE TABLE public.tb_score
(
id SERIAL,
t_name character varying(24) NOT NULL,
t_course character varying(64) NOT NULL,
t_score smallint NOT NULL DEFAULT 0,
CONSTRAINT tb_score_id PRIMARY KEY (id),
CONSTRAINT tb_score_unq_name UNIQUE (t_name, t_course)
)
WITH (
OIDS=FALSE
);
2) 插入資料
INSERT INTO public.tb_score (t_name, t_course, t_score)
VALUES ('小明','語文',90), ('小明','數學',87),
('小明','英語',85), ('小紅','語文',92),
('小紅','數學',89), ('小紅','英語',95);
3) 查詢
SELECT t_name as "姓名",
SUM (CASE t_course WHEN '數學' THEN t_score ELSE 0 END) AS "數學",
SUM(CASE t_course WHEN '英語' THEN t_score ELSE 0 END) AS 英語,
SUM(CASE t_course WHEN '語文' THEN t_score ELSE 0 END) AS 語文
FROM public.tb_score
GROUP BY t_name;
SELECT t_name as "姓名",
SUM(CASE t_course WHEN '數學' THEN t_score ELSE null END) 數學,
SUM(CASE t_course WHEN '英語' THEN t_score ELSE null END) 英語,
SUM(CASE t_course WHEN '語文' THEN t_score ELSE null END) 語文
FROM public.tb_score
GROUP BY t_name;