1. 程式人生 > >SQL 操作列轉行查詢

SQL 操作列轉行查詢

題目: 如下一張學生成績表(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;