精华内容
下载资源
问答
  • SQL将一行多列数据合并成 一列

    万次阅读 2016-08-19 12:39:33
    由于最近在做项目的时候,要对数据库中一行多列数据进行求和,便在网上查了一下,首先要用到动态SQL语句,动态sql感觉就是类似于拼接sql字符串 动态语句基本语法 1 :普通SQL语句可以用exec执行 Select * ...

    由于最近在做项目的时候,要对数据库中一行很多列个数据进行求和,便在网上查了一下,首先要用到动态SQL语句,动态sql感觉就是类似于拼接sql字符串

    动态语句基本语法
    1 :普通SQL语句可以用exec执行
    Select * from tableName
    exec('select * from tableName')
    exec sp_executesql N'select * from tableName' -- 请注意字符串前一定要加N

    2:字段名,表名,数据库名之类作为变量时,必须用动态SQL

    declare @fname nvarchar(20)
    set @fname = 'FiledName'
    Select @fname from tableName -- 错误,不会提示错误,但结果为固定值FiledName,并非所要。
    exec('select ' + @fname + ' from tableName') --
    请注意 加号前后的 单引号的边上加空格
    如果设置字符串变量,应该把它设置成nvarchar,但是我在SQL SERVER2014上面用varchar照样也可以
    接下来就是具体的执行代码
    select 列1+列2+...+列30 from table
    declare @sql nvarchar(1000)
    set @sql=''
    select @sql=@sql+'+isnull('+name+',0)'--inull(paras1,paras2)函数用来判断是否为空,如果为空用paras2替换
    from syscolumns 
    where id=object_id('表名') and xtype=56  --56表示整型 
    set @sql=stuff(@sql,1,1,'')--用于将第一加号替换掉,这一句代码不可以少否则会出现错误
    print ('select '+@sql+' from 表名')
    exec ('select '+@sql+' from 表名')
    例如如上面的一张表格我要对其进行求和:
    use test
    go
    declare @sql varchar(1000)
    set @sql=''
    select @sql=@sql+'+isnull('+name+',0)'
    from syscolumns
    where id=object_id('tb1') and xtype=56--对应整型
    set @sql=stuff(@sql,1,1,'')
    print ('select '+@sql+' from tb1')

    exec ('select '+@sql+' from tb1')
    上面就是求得的结果,因为我把id和id1这两列设成了整型和浮点型所只计算了第一列
    如果只想求一行的和可以在select 语句里加上TOP 函数,就可以了
    如果我们想把执行动态SQL 的结果赋值给另一变量的话,就需要执行存储过程了,在执行下面的存储过程的时候如果是字符串类型的话应该都设置为nvarchar 这样可以避免出错
    EXEC sp_executesql

       @stmt= <statement>,--类似存储过程主体

    @params
    = <params>, --类似存储过程参数部分,声明参数类型

    <params assignment> --类似存储过程调用,为参数赋值,参数值要和参数顺序要一一对应,也可以通过为参数指明参数值的方式为其赋值
    附上我写的代码:
    declare @sum int,@sql nvarchar(1000),@num int,@sql1 nvarchar(100)
    set @sql=''
    select @sql=@sql+'+isnull('+name+',0)'
    from syscolumns
    where id=object_id('tb1') and xtype=56
    set @sql=stuff(@sql,1,1,'')


    --print ('select '+@sql+' from 表名')
    set @sql1=   'select @sum=(select top(1) id from tb1)'
    set @sql1='select @sum=(select top 1 '+@sql+' id from tb1)'
    exec sp_executesql @sql1,N'@sum int output',@num output
    select @num


    PS: syscolumns是sqlserver中的一个系统表,用来记录sqlserver中字段信息的。也就是在数据库里所有表格里 的字段的信息
    但是创建的临时表里的字段的信息并没有存储在这个系统表里


    xtype    类型
    34 image
    35 text
    36 uniqueidentifier
    48 tinyint
    52 smallint
    56 int
    58 smalldatetime
    59 real
    60 money
    61 datetime
    62 float
    98 sql_variant
    99 ntext
    104 bit
    106 decimal
    108 numeric
    122 smallmoney
    127 bigint
    165 varbinary
    167 varchar
    173 binary
    175 char
    189 timestamp
    231 sysname
    231 nvarchar
    239 nchar

    展开全文
  • 我的个人理解:mysql 行变列(多行变成一行/多行合并成一行/多行合并成多列/合并行),我觉得这都是一个意思 数据库结构如图: 而我想让同一个人的不同成绩变成此人在这一行不同列上显示出来,此时分为2中展现: ...

    我的个人理解:mysql 行变列(多行变成一行/多行合并成一行/多行合并成多列/合并行),我觉得这都是一个意思

    数据库结构如图:


    而我想让同一个人的不同成绩变成此人在这一行不同列上显示出来,此时分为2中展现:

    第一种展现如图----【多行变一列】(合并后的数据在同一列上):


    sql如下:

    select name ,group_concat(sore Separator ';') as score from stu group by name 
    第二种展现如图----【多行变多列】(合并后的数据在不同列上):

    sql如下:

    SELECT name ,
    MAX(CASE type WHEN '数学' THEN score ELSE 0 END ) math,
    MAX(CASE type WHEN '英语' THEN score ELSE 0 END ) English ,
    MAX(CASE type WHEN '语文' THEN score ELSE 0 END ) Chinese 
    FROM stu  
    GROUP BY name
    -----------------------------------------------------------------------------------------------------可爱的分割线----------------------------------------------------------------------------------------------------

    当然,在第一种情况中(显示在一列),也有些其他的类似形式:

    形式一:

    sql如下:

    select name ,group_concat(type,'分数为:',score  Separator '; ') as score from stu group by name 

    呵呵,当然 如果你很熟悉group_concat和concat的用法,你也做出如下形式:

    其sql如下:

    select name ,concat(name ,'的分数为[',group_concat(type,'分数为:',score  Separator '; '),']') as score from stu group by name 


    展开全文
  • 背景 题目比较抽象,具体解释一下。...这里多行数据比较混乱,想将多行数据按照标识分组,再改为一行多列: 客户 状态 小老鼠 20200428:高兴 20200502 难受 20200503:相思 小八戒 20200429:开心 202
  • 问题描述:在开发中,需求:对一张含有个 产品代码的产品表,个产品代码对应2()个业务码,现在业务码122表示申购,124表示赎回,需将同一支产品的不同业务码对应的费率字段合并到同一条数据上显示。...

    问题描述:在开发中,需求:对一张含有多个 产品代码的产品表,一个产品代码对应2(多)个业务码,现在业务码122表示申购,124表示赎回,需将同一支产品的不同业务码对应的费率字段合并到同一条数据上显示。实际就是解决将数据列变数据行合并显示的问题。

    prd_code busin_code ... fee_rate
    110002 124   reebackfee
    110002 122   buyfee
    110003 122    

    需要 实现的效果:

    prd_code reebakfee buyfee busin_code
    110002 ... ... 122,124
    110003 ... ... 122,124
    110004 ... ... ...

    解决方案: 

    方法一:将该产品表【tbproduct 】用prd_code 字段拼接一遍,新表数据【 tbproduct  a,tbproduct  b】的同一行中,既含有busin_code='122' 又含有busin_code ='124' 的数据

    这样可实现多行数据同一行显示。

              select a.prd_code,a.busin_code,a.rate,b.busin_code,b.rate from tbproduct  a,tbproduct  b where a.prd_code = b.prd_code and a.busin_code = '122' and b.busin_code = '124';

    方法二:该方法适合ora 11以上的版本

    select a.prd_code,listagg(a.rate,',') within group (order by a.busin_code) ind,listagg(a.busin_code,',') within group (order by a.busin_code) ind  from tbproduct  a group by a.prd_code

    方法三:select t.prd_code,wm_concat(t.busin_code),wm_concat(t.rate) from tbproduct  t group by t.prd_code;

     

    【表名自行更换】

                        

    转载于:https://www.cnblogs.com/lahm/p/8553704.html

    展开全文
  • 绝对有用的excel 合并 ,两列或者多列合并成一行,多行合并成一列
  • 大家平时在查询数据的时候,肯定会遇到需要将一个值变成一行; 第一种情况:显示在同一行的同一上 1、新建一个表test 可以参考:https://blog.csdn.net/heqiang525/article/details/90210326 里面的建表...

    大家平时在查询数据的时候,肯定会遇到需要将一列的多个值变成一行

    第一种情况:显示在同一行的同一列上

    1、新建一个表test

    可以参考:https://blog.csdn.net/heqiang525/article/details/90210326 

    里面的建表、插入数据的操作。结果如下图:

    2、selcect name, wmsys.wm_concat(type) type_sums from test group by name;

    其中wmsys.wm_concat(type) 也可以改成wmsys.wm_concat(score)

    结果如下:

    结果中的type_sums显示<CLOB>点击旁边的...也可以正常显示内容,但是感觉不爽!!!

    修改如下:

    select name, dbms_lob.substr(wmsys.wm_concat(type)) type_sums from test group by name;

    完美解决!!!结果如下:

    第二种情况:显示在同一行的不同列上

    select name, max(decode(type,'math',score,0)) as 数学, max(decode(type,'english',score,0)) as 英语, max(decode(type,'chinese',score,0)) as 语文  from test group by name;

    结果如下:

     

    展开全文
  • SQL数据多行合并成一行多列

    千次阅读 2009-06-16 17:03:00
    create table [Data_NewTrayGuide_Picture]( [vpictureid] int IDENTITY(1,1) NOT NULL, [VID] int not null, [title] varchar(2000) not null)go/**********插入测试数据*******************/declare
  • WM_CONCAT 合并成一行数据数据量大会超出字符长度 SELECT wm_concat(sbpt.ParkStime || ' ~ ' || sbpt.ParkEtime) FROM SYS_BerthTypeParkTime sbpt REPLACE 分成多列 SELECT REPLACE (sbpt....
  • 合并成 解决: 1.wm_concat方法: select data_id,wmsys.wm_concat(rule_name) as rule_name from RHSA_AUDIT_RESULTS where data_id='a3506a2206f3417fb204993096d5ae7a' group by data_id 2....
  •   1.效果演示 (1)不做处理 ...(2)合并多列,并对后四列的值做并集处理   2.SQL语句 (1)不做处理 1 SELECT 2 C .fd_tenantid AS fdTenantId, 3 C .fd_resid AS fdResid, 4
  • 数据:idcodenamevalue-----------------------------12014000A1022014000B...
  • 今天在做一个跑批任务中,需要在oracle函数里把多行数据合并成一行,顺道发挥下常用的几种方法。 一、wm_concat wm_concat函数是是oracle中常用的函数,功能:行转,可以将查询出的多行某值使用逗号进行隔开...
  • 参考来自:... 1.效果演示 (1)不做处理 ...(2)合并多列,并对后四列的值做并集处理 2.SQL语句 (1)不做处理 1 SELECT 2 C .fd_tenantid AS fdTenantId, 3 C .fd_resid AS fdResid...
  • 融e学-个专注于重构知识,培养复合型人才的平台:http://www.i-ronge.com/ (1)不做处理: SELECT e.class_id AS class_id, c.course_name AS class_name, u.stuNum AS stu_num, u.USER_NAME AS student_...
  • 原始需求如下: 业务系统设置这样,见截图。 工资项目为了方便录入,...在Kettle里面做转行的转换就。参考如下。 其中表输入的数据预览如下。 专列设置如下:其中第1是选择字段,第2、...
  • 最近做项目的时候有个查询页面,查询结果中有几行数据,前面的列都相同,只是最后一列的Country不同,所以会显示数据,现打算把具有相同ID的不同Country合并成一条数据,并显示该ID对应的所有的Country。...
  • 创建数据集 dataDict = {‘a’:[‘one’,‘two’], ‘b’:[[2,3],[1,3,6]...实现,drop(‘level_2’, axis = 1):删掉新产生的索引,level_i中的i为groupby中数 df = t.groupby([‘a’, ‘c’]).b.apply(l...
  • 最近有业务需求,将个表格的数据合并到一起做统计。就是像SQL一样,将很个表合并成一个。 犹豫表格太,而且相同的id也不是按一样的顺序排列的,所以复制粘贴的难度加大了。 2、效果图 表1: 表2: 表3: ...
  • 在数据分析过程中,有时候我们经常需要将多列指标合并列,比如将个100人5个观察时间点生成的1005列数据表,转换5001列的数据表,从而满足作图、分析的进一步需求。那么,在JMP中如何快速实现呢?今天这...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 398
精华内容 159
热门标签
关键字:

多列数据合并成一行