zoukankan      html  css  js  c++  java
  • SQL 查询横表变竖表

    测试数据:

    CREATE TABLE test (name char(10),subject char(10),score int)
    go
    insert test values( '张三 ', '语文 ',80)
    insert test values( '张三 ', '数学 ',86)
    insert test values( '张三 ', '英语 ',75)
    insert test values( '李四 ', '语文 ',78)
    insert test values( '李四 ', '数学 ',85)
    insert test values( '李四 ', '英语 ',78)

    select * from test
    --
    --想变成以下效果
    --
    -- 姓名 语文 数学 英语
    -- 张三 80 86 75
    -- 李四 78 85 78

    --T-SQL

    MS SQL Server中

    分析一下思路

    1.先通过CASE,将各科目分别开来,

    2.再统计一下各科目的成绩.

    ---1.先分列
    select name,
    case t.subject when '语文' then t.score else 0 end as 语文,
    case t.subject when '数学' then t.score else 0 end as 数学,
    case t.subject when '英语' then t.score else 0 end as 英语
    from test t
    group by t.name

     

    数据库查询横表变竖表

    ---2.再对列求和
    select name,
    sum(case t.subject when '语文' then t.score else 0 end ) 语文,
    sum(case t.subject when '数学' then t.score else 0 end ) 数学,
    sum(case t.subject when '英语' then t.score else 0 end ) 英语
    from test t
    group by t.name

     

    数据库查询横表变竖表

     

    首先是三张表, CNo对应的是课程,在这里我就粘贴了。            

                                  主表

                     人名表

    按照常规查询

    SELECT s.SName, c.CName,s2.SCgrade

      FROM S s INNER JOIN SC s2 ON s2.SNo = s.SNo INNER JOIN C c ON c.CNo = s2.CNo

    那么结果是这样的

    但是这是横表 不是我想看到的结果。

    我们要看到这样的结果:

    那么怎么办呢?

       第一种写法:SELECT w.SName,

       sum(case when  w.CNo= 1 then w.SCgrade   ELSE 0 END) AS '语文',

        sum(case  WHEN w.CNo =2 THEN  w.SCgrade  ELSE   0 END) AS '数学',

      sum(case when  w.CNo= 3 then w.SCgrade  ELSE  0 END) AS '英语'

    FROM

    (SELECT s.SNo,s.SName, s2.CNo, s2.SCgrade  FROM s s INNER JOIN SC s2 ON s2.SNo = s.SNo WHERE s.SNo IN (SELECT c.SNo  FROM sc c GROUP BY c.SNo ))

    AS w GROUP BY w.SName

      

       第二种写法: SELECT s.SName,

       sum(case when  s2.CNo= 1 then s2.SCgrade   ELSE 0 END) AS '语文',

        sum(case  WHEN s2.CNo =2 THEN  s2.SCgrade  ELSE   0 END) AS '数学',

      sum(case when  s2.CNo= 3 then s2.SCgrade  ELSE  0 END) AS '英语'

    FROM

     S s INNER JOIN SC s2 ON s2.SNo = s.SNo

    INNER JOIN C c ON c.CNo = s2.CNo

     GROUP BY s.SNo,

     s.SName

       这是我工作遇到过得情况,总结下来。如果有遇到这种情况的话可以参考下。

  • 相关阅读:
    【转载】关于nginx以及内核参数的配置
    【转载】Oracle 中count(1) 、count(*) 和count(列名) 函数的区别
    【转载】GET和POST两种基本请求方法的区别
    Eureka的使用
    【转载】Spring Cloud全家桶主要组件及简要介绍
    java阶段学习目标
    【转载】java对象和byte数组互转,直接拿去用
    【转载】非对称加密过程详解(基于RSA非对称加密算法实现)
    Python 四种数值类型(int,long,float,complex)区别及转换
    Python2和Python3中print的不同点
  • 原文地址:https://www.cnblogs.com/hellobj/p/3436314.html
Copyright © 2011-2022 走看看