精华内容
下载资源
问答
  • SQL行转列列转行.txt

    2021-08-30 09:45:51
    SQL行转列列转行.txt
  • SQL行转列、列转行

    万次阅读 多人点赞 2018-09-09 15:51:14
    SQL行转列、列转行 这个主题还是比较常见的,行转列主要适用于对数据作聚合统计,如统计某类目的商品在某个时间区间的销售情况。列转行问题同样也很常见。 一、整理测试数据 create table wyc_test( id int(32)...

    SQL行转列、列转行

    这个主题还是比较常见的,行转列主要适用于对数据作聚合统计,如统计某类目的商品在某个时间区间的销售情况。列转行问题同样也很常见。

    一、整理测试数据

    create table wyc_test(
    	id int(32) not null auto_increment,
    	name varchar(80) default null,
    	date date default null,
    	scount int(32),
    	primary key (id)
    );
    INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (1,'小说','2013-09-01',10000);
    INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (2,'微信','2013-09-01',20000);
    INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (3,'小说','2013-09-02',30000);
    INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (4,'微信','2013-09-02',35000);
    INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (5,'小说','2013-09-03',31000);
    INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (6,'微信','2013-09-03',36000);
    INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (7,'小说','2013-09-04',35000);
    INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (8,'微信','2013-09-04',38000);
    INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (9,'小说','2013-09-01',80000);
    INSERT INTO `wyc_test` (`id`,`name`,`date`,`scount`) VALUES (10,'微信','2013-09-01',70000);
    

    二、行转列

    主要思路是分组后使用case进行条件判断处理

    #行转列
    select 
        a.date,
        sum(case a.name
            when '小说' then a.scount
            else 0
        end) 'sum_小说',
        max(case a.name
            when '小说' then a.scount
            else 0
        end) 'max_小说',
        sum(case a.name
            when '微信' then a.scount
            else 0
        end) '微信',
        max(case a.name
            when '小说' then a.scount
            else 0
        end) 'max_微信'
    from
        wyc_test a
    group by date;

    结果:

    三、列转行

    主要思路也是分组后使用case

    #列转行
    select 
        a.date,
        concat('小说:',
                cast(sum(case a.name
                        when '小说' then a.scount
                        else 0
                    end)
                    as char),
                '微信',
                cast(sum(case a.name
                        when '微信' then a.scount
                        else 0
                    end)
                    as char)) as 'str'
    from
        wyc_test a
    group by a.date;
    #列转行
    #1.使用mysql提供的函数分组
    select a.date,group_concat(a.name,'总量:', a.scount) from wyc_test a group by a.date,a.name;
    #2.使用mysql提供的函数分组
    select a.date,a.name, group_concat(a.name, '总量:', a.scount) from wyc_test a group by a.date,a.name;
    #3.普通group结合字符串拼接
    SELECT 
        a.date,
        concat('小说总量:',
                cast(sum(case a.name
                        when '小说' then a.scount
                        else 0
                    end)
                    as char)) as '小说',
        concat('微信总量:',
                cast(sum(case a.name
                        when '微信' then a.scount
                        else 0
                    end)
                    as char)) as '微信'
    from
        wyc_test a
    group by a.date;

    结果:

    四、列转行详解
     
    1.1、初始测试数据
            表结构:TEST_TB_GRADE2
    Sql代码 
    create table TEST_TB_GRADE2 

      ID         NUMBER(10) not null, 
      USER_NAME  VARCHAR2(20 CHAR), 
      CN_SCORE   FLOAT, 
      MATH_SCORE FLOAT, 
      EN_SCORE   FLOAT 

     
            初始数据如下图:

           
     
    1.2、 如果需要实现如下的查询效果图:

                          
     
    这就是最常见的列转行,主要原理是利用SQL里面的union,具体的sql语句如下:
    Sql代码 
    select user_name, '语文' COURSE , CN_SCORE as SCORE from test_tb_grade2  
    union select user_name, '数学' COURSE, MATH_SCORE as SCORE from test_tb_grade2  
    union select user_name, '英语' COURSE, EN_SCORE as SCORE from test_tb_grade2  
    order by user_name,COURSE  
     
     也可以利用【 insert all into ... select 】来实现,首先需要先建一个表TEST_TB_GRADE3:
    Sql代码 
    create table TEST_TB_GRADE3   
        (  
          USER_NAME VARCHAR2(20 CHAR),   
          COURSE    VARCHAR2(20 CHAR),   
          SCORE     FLOAT   
        )   
     再执行下面的sql:
     
    Sql代码 
    insert all 
    into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '语文', CN_SCORE) 
    into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '数学', MATH_SCORE) 
    into test_tb_grade3(USER_NAME,COURSE,SCORE) values(user_name, '英语', EN_SCORE) 
    select user_name, CN_SCORE, MATH_SCORE, EN_SCORE from test_tb_grade2; 
    commit; 

     别忘记commit操作,然后再查询TEST_TB_GRADE3,发现表中的数据就是列转成行了。

     

    展开全文
  • 主要介绍了SQL行转列和列转行代码详解,涉及动态方案和静态方案两种处理方式,具有一定参考价值,需要的朋友可以了解下。
  • sql 行转列

    千次阅读 2016-11-03 15:15:27
    一、行转列 PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 1、格式 table_source PIVOT( 聚合...

    一、行转列

    PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现

    PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P

    1、格式

    table_source
    PIVOT(
    聚合函数(value_column)
    FOR pivot_column
    IN(<column_list>)
    )
    2、实例
    (1)静态方式
    SELECT  m.* ,
            n.总分 ,
            n.平均分
    FROM    ( SELECT    *
              FROM      tb PIVOT( MAX(分数) FOR 课程 IN ( 语文, 数学, 物理 ) ) a
            ) m ,
            ( SELECT    姓名 ,
                        SUM(分数) 总分 ,
                        CAST(AVG(分数 * 1.0) AS DECIMAL(18, 2)) 平均分
              FROM      tb
              GROUP BY  姓名
            ) n
    WHERE   m.姓名 = n.姓名
    (2)动态方式
    --使用stuff()
    
    DECLARE @sql VARCHAR(8000)
    
    SET @sql=''  --初始化变量 @sql
    
    SELECT @sql= @sql+',' + 课程 FROM tb GROUP BY 课程 --变量多值赋值
    
    SET @sql= STUFF(@sql,1,1,'')--去掉首个','
    
    SET @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'
    
    PRINT @sql
    
    exec(@sql)
    
    --或使用isnull()
    
    DECLARE @sql VARCHAR(8000)
    
    --获得课程集合
    
    SELECT @sql= ISNULL(@sql+',','')+课程 FROM tb
    GROUP BY 课程           
    
    SET @sql='select * from tb pivot (max(分数) for 课程 in ('+@sql+'))a'
    
    exec(@sql)

    二、列转行
    UNPIVOT 用于将列明转为列值(即列转行),在SQL Server 2000可以用UNION来实现

    1、格式

    table_source
    UNPIVOT(
    value_column
    FOR pivot_column
    IN(<column_list>)
    )

    2、实例

    (1)静态
    --SQL SERVER 2005动态SQL
    
    SELECT  姓名 ,
            课程 ,
            分数
    FROM    tb UNPIVOT ( 分数 FOR 课程 IN ( [语文], [数学], [物理] ) ) t
      (2)动态
    --SQL SERVER 2005动态SQL
    
    DECLARE @sql NVARCHAR(4000)
    
    SELECT  @sql = ISNULL(@sql + ',', '') + QUOTENAME(name)
    FROM    syscolumns
    WHERE   id = OBJECT_ID('tb')
            AND name NOT IN ( '姓名' )
    ORDER BY colid
    
    SET @sql = 'select 姓名,[课程],[分数] from tb unpivot ([分数] for [课程] in(' + @sql
        + '))b'
    
    EXEC(@sql)



    展开全文
  • 主要给大家介绍了关于SQL行转列、列转行的简单实现方法,文中通过示例代码介绍的非常详细,对大家学习或者使用SQL具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • SQL行转列

    万次阅读 2018-09-04 08:44:15
    阅读目录  一:前言  二:第一次思考  三:第二次思考  四:第三次思考  一:前言 ... 可以看得出来,表2是由表1的数据转化而来的,只有Name是表1中的,一步一步的来,其他的难搞,如...

    阅读目录
      一:前言
      二:第一次思考
      三:第二次思考
      四:第三次思考
      一:前言
      在我们做的一些项目中经常会碰到把行转化为列的问题,那么我们今天就来探讨一下,我们怎么样把表1转化为表2的格式


       
            图一
      

            图二
      二:第一次思考
      可以看得出来,表2列是由表1的数据行转化而来的,只有Name列是表1中的列,一步一步的来,其他的列难搞,如果表2只有1列Name的话,那么简单了,不就是一个简单的分组
      SELECT [Name] FROM NameAndSubjectAndGrade GROUP BY [Name]
      现在SQL语句的架子搭起来了,无论以后如何变化,分组是少不了的
        

      二:第二次思考
      现在我们想在这个结果集中再添加1列,多了我们不加,因为你不论是能处理语文,还是数学,还是英语列,那么其他的列只要原样照抄就可以了,我们就只在现在的基础上添加一个语文列吧
      SELECT [Name], CASE WHEN Subject = '语文' THEN Grade END FROM NameAndSubjectAndGrade GROUP BY [Name]
      

      我们看错误提示,Subject和Grade列要在聚合函数或者GROUP BY 子句中,那么我们先把Subject和Grade列放在GROUP BY 子句中
      SELECT [Name],CASE WHEN Subject = '语文' THEN Grade END FROM NameAndSubjectAndGrade GROUP BY [Name],Subject,Grade
      数据倒是有了,可是行多了点,看来只能从聚合入手
      

      三:第三次思考
      我们从聚合函数入手
      SELECT [Name],
      SUM(CASE WHEN Subject = '语文' THEN Grade ELSE 0 END) AS YuWen
      FROM NameAndSubjectAndGrade GROUP BY [Name]
     
     
      那么其他几列也就好办了,我们发挥我们的Ctr+C,Ctr+V
      SELECT [Name],
      SUM(CASE WHEN Subject = '语文' THEN Grade END) AS YuWen,
      SUM(CASE WHEN Subject = '数学' THEN Grade END) AS ShuXue,
      SUM(CASE WHEN Subject = '英语' THEN Grade END) AS YingYu
      FROM NameAndSubjectAndGrade GROUP BY [Name]
     
     
      四:第四次思考
      马六同学成天逃课,数学和英语就没参加考试,那么我们不应该显示'NULL',应该显示为'0',可是结果有NULL,那不太好,我们来把CASE WHEN THEN END写完,在此之间加个ELSE 0
      SELECT [Name],
      SUM(CASE WHEN Subject = '语文' THEN Grade ELSE 0 END) AS YuWen,
      SUM(CASE WHEN Subject = '数学' THEN Grade ELSE 0 END) AS ShuXue,
      SUM(CASE WHEN Subject = '英语' THEN Grade ELSE 0 END) AS YingYu
      FROM NameAndSubjectAndGrade GROUP BY [Name]
      最后完成了
      

      
    每天学习一点点,每天进步一点点 用文字记录工作,用文字记录人生


    作者 从小就犯困

    展开全文
  • sql行转列

    千次阅读 热门讨论 2016-04-30 14:27:01
    在这个过程中,用到了关于sql语句行转列的方法。那么应该如何操作呢?  项目中的过程比较复杂,我就自己建立一个测试库来进行说明。  首先建立数据表test,添加三个字段:姓名(name,varchar2(10))、课程...

        近期在做项目时,用户给出了几张报表的需求,需要对数据进行汇总。在这个过程中,用到了关于sql语句行转列的方法。那么应该如何操作呢?

        项目中的过程比较复杂,我就自己建立一个测试库来进行说明。

        首先建立数据表test,添加三个字段:姓名(name,varchar2(10))、课程(course,varchar2(10))、分数(score,varchar2(10))。

        插入数据:          

    insert into test(name,course,score) values('victor','物理',70)
    insert into test(name,course,score) values('victor','英语',90)
    insert into test(name,course,score) values('victor','数学',85)
    insert into test(name,course,score) values('victor','语文',80)
    insert into test(name,course,score) values('lucy','物理',90)
    insert into test(name,course,score) values('lucy','英语',85)
    insert into test(name,course,score) values('lucy','语文',85)
    insert into test(name,course,score) values('lucy','数学',80)
    insert into test(name,course,score) values('Jim','物理',85)
    insert into test(name,course,score) values('Jim','数学',80)
    insert into test(name,course,score) values('victor','语文',80)
       正常情况下,我们使用查询语句,查询到的结果是:

        

        而当我们要统计个人信息时,就不能这样显示,需要把每个人的信息放到一行。做到这一点,我们有两种方法。一种是,通过上述查询语句得到结果,然后在程序中进行数据拆分与组合,按用户的要求进行选择。而另一种方法是,使用sql语句进行数据处理,这就用到了sql中的行转列。如下:     

    select name,
           sum(case Course when '语文' then Score else null end) 语文,
           sum(case Course when '数学' then Score else null end) 数学,
           sum(case Course when '英语' then Score else null end) 英语,
           sum(case Course when '物理' then Score else null end) 物理
      from test
     group by name

         得到的结果如下:

         

        这种方法使用的是sum和case when的组合进行查询的,由于case when可以用于sql server,所以此方法既可以在sql server中应用,也可以在oracle中使用。而实现上述功能还可以使用sum和decode函数结合,但是由于decode函数只能在oracle数据库中应用。方法如下:    

    select name,
           sum(decode(course, '语文', score)) 语文,
           sum(decode(course, '数学', score)) 数学,
           sum(decode(course, '英语', score)) 英语,
           sum(decode(course, '物理', score)) 物理
      from test
     group by name
        这样就可以将我们所要的信息组合起来,进行信息统计。

        sum函数主要是用来求和的;decode函数是对数据进行处理,可以将数据结果翻译成其他值,其作用效果与case when的效果是一样的。


      小结:

        通过这次的需求实现,对sql的用法又增加了一点认识,感觉到sql的强大之处,自己在这方面的学习还需要进一步加深。这次的实现是通过函数之间的结合来实现的,在今后的学习中,应该学习这方面的思想,不能只想着一种函数的应用,而忽略结合后的强大用法。




    展开全文
  • SQL行转列学习

    2018-12-11 08:46:50
    SQL行转列学习谢谢!
  • SQL行转列参考代码(sqlserver)
  • sql行转列_列转行问题.
  • sql行转列,与列转行

    2013-05-10 10:34:07
    sql 行转列 与列转行,oracle ,msssql等,详细数据库操作方法,各种例子,欢迎大家学习。、~
  • sql行转列解决方案.

    2012-07-22 23:50:26
    sql行转列解决方案.
  • SQL 行转列+动态获取列名 通用的动态获取列名
  • sql行转列动态与静态

    2012-02-03 10:21:04
    sql行转列动态与静态三种方法
  • 以前有写过行转列,列转行的博客 具体见: ...今天分享下使用case when,union all实现sql行转列、列转行 -- 建表 CREATE TABLE StudentScores ( UserName NVARCHAR(20), ...
  • java sql 行转列sql

    2014-12-04 13:15:49
    详细解释 行转列sql语句,作为范例查看sql
  • sql 行转列,列转行整合

    千次阅读 2019-09-20 14:42:17
    一:行转列 原始数据及结构如下: (1)使用分组结合casewhen首先根据姓名分组,再依次获取各科成绩 select t.name , sum( case t.subject when '语文' then t.score else 0 end) 语文, sum ( case t....
  • SQL行转列显示

    2012-04-18 11:13:35
    利用SQL语句将表行转列显示,应用的是PIVOT ,很方便
  • SQL行转列举例

    2012-10-12 14:11:59
    很好的行转列SQL写法,对SQL的拼装和拆分有很好的描述,可以帮助解析SQL的重组。
  • 有case when方式和2005之后的内置pivot和unpivot方法来实现,行列互,可以分为静态互,动态互
  • SQL行转列汇总--通用方法

    千次阅读 2015-09-16 15:30:33
    SQL行转列汇总 PIVOT 用于将列值旋转为列名(即行转列),在 SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT 的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 注意:PIVOT、UNPIVOT是SQL Server...
  • SQL行转列汇总

    千次阅读 2014-03-26 09:58:35
    SQL行转列汇总   PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVOT(聚合函数(列) FOR 列 in (…) )AS P 完整语法: table_...
  • SQL 行转列和列转行

    千次阅读 2017-05-15 22:13:00
    行转列一般通过CASE WHEN 语句来实现,也可以通过 SQL SERVER 2005 新增的运算符PIVOT来实现。用传统的方法,比较好理解。层次清晰,而且比较习惯。 但是PIVOT 、UNPIVOT提供的语法比一系列复杂的SELECT…CASE 语句...
  • SQL行转列的实现

    千次阅读 2019-06-19 16:43:34
    将列值旋转成列名(即行转列)是我们在开发中经常会遇到的一个需要,下面就介绍三种实现思路。 假设我有表tb_score且表中数据如下图: 行转列之后的效果如下图: 方式一:使用静态SQL select user_name 姓名,...
  • SQL 行转列 列转行 case when 写法

    千次阅读 2020-04-10 10:48:38
    关于mysql 对 行转列,列转行的sql 编写,只用case when的写法 现有一组数据如下,该组数据网上随便找的,具体参考业务需求 利用SQL达到如下效果 实现语句 select name,max(case when subject=‘chinese’ then ...
  • hivesql 行转列与列转行 列转行函数——collect_set和collect_list hive里通常通过collect_set和collect_list来进行列转行,其中collect_list为不去重转换,collect_set为去重转换。 下面我们将通过一个实例来进行...
  • T-SQL行转列示例实例

    2012-03-17 17:35:00
    T-SQL编程行转列示例实例,进阶应用。
  • 讲述,sql中如何实现行转列的实例,包含知道固定行数的静态转换,与未知行数的动态转换。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 205,579
精华内容 82,231
关键字:

sql行转列