精华内容
下载资源
问答
  • 数据库行列转换
    2021-02-02 11:54:51

    原表:

    表名 :user

    name          course    grade

    zhangsan      java        70

    zhangsan      C++         80

    lisi             java      90

    lisi             C#        60

    用一条 SQL 语句得到如下形式:

    name     java   C++   C#

    zhangsan  70     80   null

    lisi      90    null  60

    分析:这是典型的行列转换问题,现给出两种转换语句:

    SQL1:

    select   name,

    sum(case when course='java' then grade end) as java,

    sum(case when course='C++' then grade end) as C++,

    sum(case when course='C#' then grade end) as C#

    from test group by name

    SQL2:

    select  distinct c.`name` AS name, (select grade from test where name = c.`name` and course = 'java' )as java, (select grade from test where name = c.`name` and course = 'C++' )as C++, (select grade from test where name = c.`name` and course = 'C#' )as C# from test c

    更多相关内容
  • 数据库行列转换

    2021-02-02 11:54:57
    虽然开发过程中没用过行列转换,但是听说面试时常常会遇到这个问题,以前在网上也看到过大神的例子,今天自己仔细的玩了下,希望和大家分享一下了。 注意:列转行的方法可能是我独创的了,呵呵,因为在网上找不到哦...

    虽然开发过程中没用过行列转换,但是听说面试时常常会遇到这个问题,以前在网上也看到过大神的例子,今天自己仔细的玩了下,希望和大家分享一下了。 注意:列转行的方法可能是我独创的了,呵呵,因为在网上找不到哦,全部是我自己写的,用到了系统的SysColum

    虽然开发过程中没用过行列转换,但是听说面试时常常会遇到这个问题,以前在网上也看到过大神的例子,今天自己仔细的玩了下,希望和大家分享一下了。

    注意:列转行的方法可能是我独创的了,呵呵,因为在网上找不到哦,全部是我自己写的,用到了系统的SysColumns

    (一)行转列的方法

    先说说行转列的方法,这个就比较好想了,利用拼sql和case when解决即可

    实现目的

    9ea43c7a0d58f652867de94b4fc9534f.bmp

    1:建立测试用的数据库

    CREATE TABLE RowTest(

    [Name] [nvarchar](10) NULL,--名稱

    [Course] [nvarchar](10) NULL,--課程名稱

    [Record] [int] NULL--課程的分數

    )

    2:加入测试用的数据库(先加入整齐的数据)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    insert into RowTest values (,,)

    3:设计想法

    行转列的原理就是把行的类别找出来当做查询的字段,利用case when 把当前的分数加到当前的字段上去,最后用group by 把数据整合在一起

    4:通用方法

    declare @sql nvarchar(max)@sql=@sql+++TCourse.Course++TCourse.Coursefrom (select distinct Course fromRowTest)TCourseprint @sql

    exec(@sql)

    说明: 把所有的课程名称取出来作为列(查询表TCourse)

    用case when 的方法把sql 拼出来

    5:课外试验

    (1)加入数据

    insert into dbo.RowTest values (,,)

    去除max 方法会报错,因为一条可能对应多行数据

    (2)加入数据

    insert into dbo.RowTest values (,,)

    数据会多出一列,但是其他人无此课程就会为0

    至此,数据行转列ok

    (二)列转行的新方法开始了

    实现目的

    bb362bc594df71b1b0c69ee814a252d8.bmp

    1:实现原理

    在网上看了别人的做法,,基本都是用union all 来一个个转换的,我觉得不太好用。

    首先我想到了要把所有的列名取出来,就在网上查了下获取表的所有列名

    然后我可以把主表和列名形成的表串起来,这样就可以形成需要的列数,然后根据判断取值就完成了了,呵呵

    2:建立表格

    create table CoulumTest

    (

    Name nvarchar(10),

    语文int,

    数学int,

    英语int)

    3:加入数据

    insert into CoulumTest values(N,90,91,92)

    insert into CoulumTest values(N,80,81,82)

    4:经典的地方来了

    selectCT.Name,Col.name 课程,

    (then CT.语文 when Col.name=Nthen CT.数学

    when Col.name=Nthen CT.英语 end ) as 分数 fromCoulumTest CT

    left join ()) Col on Col.name<>

    你没看错,一句话搞定,但是有个问题迷惑了我,我觉得还不够简化,如果可以把case when 都不用了就更好了,请大神们指点小弟一下了。怎么根据

    Col的name 直接取得分数

    f68f2add0b68e4f9810432fce46917b7.png

    本文原创发布php中文网,转载请注明出处,感谢您的尊重!

    展开全文
  • 数据库行列转换技巧

    2021-02-08 09:25:59
    数据库中有表记录:客户名称,商品类型,购买数量。 需要转换成:每个客户买的各种类型的商品总量是多少。 这里可以用到oracle的 pivot 函数,这个函数可以方便的将行列进行准换。(sqlserver 也支持) ...

    在日常工作中,很有可能碰到需要把竖表的数据转换成横表数据的情况。

    如:

    数据库中有表记录:客户名称,商品类型,购买数量。

     

    需要转换成:每个客户买的各种类型的商品总量是多少。

     

    这里可以用到oracle的  pivot 函数,这个函数可以方便的将行列进行准换。(sqlserver 也支持)


    select *
    from order_list pivot xml( --pivot xml 以xml的形式输出
    sum(salesNum) for shangPin in (
    select distinct shangPin from order_list --通过查询查出所有需要转列的值,即所有列名
    )
    );

     

    如果像是mysql这种暂时还没有pivot函数支持的数据库的话。

    就需要用到子查询:

    先做出几个字段:上衣数量,裤子数量。。。等

    然后再用一个 sum 和groupby 客户 

    就可以横表转竖表了;

     

    类似sql:

    SELECT `kehu`,
    SUM(shangyi_num) '上衣数量',
    SUM(maozi_num) '帽子数量'

    FROM (
    SELECT `kehu`,

    CASE WHEN `shangpin`= '上衣' THEN
    sales_num
    END shangyi_num,
    CASE WHEN `shangpin`= '帽子' THEN
    sales_num
    END maozi_num

    FROM order_list) t
    GROUP BY `kehu`;

     

    参考

    https://blog.csdn.net/huay_li/article/details/82914161

    https://blog.csdn.net/sperospera/article/details/89199806

    展开全文
  • 虽然开发过程中没用过行列转换,但是听说面试时常常会遇到这个问题,以前在网上也看到过大神的例子,今天自己仔细的玩了下,希望和大家分享一下了
  • 达梦数据库行列转换实现方法

    千次阅读 2020-02-28 16:12:45
    假设现在有一个需求,需要把原表中的课程值作为列名查出来,那么就要用到行列转换了。在DM7中,我们有以下两种解决方案。 2.1 使用case…when的方式 分析原表,原表中NAME列有两种数值,那么我们可以对NAME进行分组...

    我们在做数据统计的时候,行转列是我们有可能会遇到的一个需求。在DM7中,我们有多种不同的方式来进行操作,本文将向大家详细介绍。

    1.建立试验环境

    在这里插入图片描述
    在这里插入图片描述

    2.行转列处理

    假设现在有一个需求,需要把原表中的课程值作为列名查出来,那么就要用到行列转换了。在DM7中,我们有以下两种解决方案。

    2.1 使用case…when的方式

    分析原表,原表中NAME列有两种数值,那么我们可以对NAME进行分组,根据不同的NAME来查询分数。

    select NAME from test group by NAME;
    

    接下来,我们既然用到了group by 语句,肯定要用聚合函数来求分数。同时,我们可以看到科目这一列有三种不同的科目,我们需要判断科目来求取分数。

    完整SQL语句如下:
    在这里插入图片描述

    2.2 利用pivot子句

    利用case…when的方式我们虽然可以达到目的,但是语句比较冗长。在DM7中,我们可以利用pivot子句的方式达到类似的目的。详细的SQL语句如下:
    在这里插入图片描述
    结果如下:
    在这里插入图片描述
    在图中我们可以看到,DM7是把三个列值作为了列名输出到了结果集中。那么我们如何引用这三个列名呢?

    假如我们直接使用select NAME,‘Chinese’,‘Maths’ ,‘English’,则会返回如下结果集
    在这里插入图片描述
    显然,DM7将其识别为了字符串。应该怎么做呢?我们需要使用双引号。那么,正确的方式应该是这样写:
    在这里插入图片描述
    结果如下:
    在这里插入图片描述
    这样一来,我们就得到了我们想要的结果。

    我们可以看到,这种方式跟case…when方式得到的结果集是完全一样的。但是在写法上,pivot语句要更为简便易读。

    展开全文
  • 数据库行列数据转换

    2022-05-11 10:10:47
    数据库行列转换,图文步骤超详细
  • 数据库行列转换算法

    2013-06-27 15:10:15
    将oralce数据库行列转换的十几种算法进行了总结。为了挣积分,就与大家共享.
  • SQL语句行列转换(附带数据库、表、视图操作) ,不错的文档。
  • 【SQL】MySQL 数据库行列转换

    千次阅读 2022-04-12 21:15:20
      报表系统中经常需要行列转换,在 SQL Server 等数据库中可以用 PIVOT 、UNPIVOT 来实现,但是在 MySQL 数据库中却不支持,下面介绍 MySQL 中的行列转换的实现方法。 1.行转列 例如下面是数据库中的原始表格: ...
  • 最近突然玩起了sql语句,想着想着便给自己出了一道题目:“行列转换”。起初瞎折腾了不少时间也上网参考了一些博文,不过大多数是采用oracle数据库当中的一些便捷函数进行处理,比如”pivot”。那么,在Mysql环境下...
  • 数据库中的行列转换

    千次阅读 2021-04-26 15:40:31
    以mysql数据库为例: 原表结构: ①行转列(sql语句): SELECT xsy, sum( CASE WHEN xscp = ‘牛奶’ THEN xsl ELSE 0 END ) AS 牛奶, sum( CASE WHEN xscp = ‘苹果汁’ THEN xsl ELSE 0 END ) AS 苹果汁, sum( ...
  • 数据库行列转换问题

    2022-07-12 16:53:47
    数据库行列转换问题
  • SQL 语句得到如下形式: name java C++ C# zhangsan 70 80 null lisi 90 null 60 分析:这是典型的行列转换问题,现给出两种转换语句: SQL1: select name, sum(case when course='java' then grade end)...
  • Oracle行列转换

    千次阅读 2022-03-14 23:04:50
    Oracle行列转换 DDL create table sale_info ( id number, product varchar2(20), quarter varchar2(10), sales number ); 准备数据 -- TV, MNT(Monitor) insert into sale_info values (1, 'TV', 'Q1', ...
  • Mysql行列转换
  • 数据库中的行列转换(横竖转换)

    千次阅读 2018-08-23 13:36:48
    (竖的数据表变横的数据表)例子: --创建tb_course表,并插入测试数据 CREATE TABLE tb_course( NAME VARCHAR(20), ##姓名 course VARCHAR(20), ##课程 grade INT ##成绩 ); ...INSERT INTO tb_course (NAME,course,...
  • Mysql实现行列转换

    千次阅读 2022-02-15 15:41:04
    mysql数据库如何实现行列转换 方案一: select name, sum(case when course='java' then grade end) as java, sum(case when course='C++' then grade end) as C++, sum(case when course='C#' then grade end) as...
  • mysql中的行列转换

    千次阅读 2021-12-07 09:30:42
    mysql中的行列转换
  • http://blog.csdn.net/kankankankan2222/article/details/7456432 //数据库网页 com.CommandText = "exec [dbo].[demo_tests] -2"; 调用存储过程语句 c#调用数据库方法 try { SqlConnection con = new S
  • oracle中行列转换总结

    千次阅读 2022-02-09 10:59:45
    oracle中行列转换1.行列转换包括以下六种情况:2. 列转行2.1 UNION ALL2.2 MODEL2.3 COLLECTION2.4 UNPIVOT3. 行转列3.1 AGGREGATE FUNCTION3.2 PIVOT4 字符串的行列转换4.1 多行转字符串4.2 字符串转多列4.3字符串...
  • 数据库行列转换sql

    2013-09-30 10:59:00
    经常折腾数据库,常常遇到数据库行列转换的问题,下面就用一个小例子来演示下如何进行行列转换。 1.创建一张表 CREATE TABLE [android_source]( [CREATETIME] [datetime] NULL, [SOURCE] [nvarchar](255) ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 17,421
精华内容 6,968
关键字:

数据库行列转换