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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值