精华内容
下载资源
问答
  • 行转列(sql行转列)

    2021-05-08 02:21:32
    sql语句行转列?怎么转啊select MIN(id) as ID, name, sex,sum(case when num=2 then 2 end) as num2,sum(case when num=3 then 3 end) as num3,sum(case when num=4 then 4 end) as num4,sum(case when num=5 then 5...

    sql语句行转列?怎么转啊

    iu4fp2meaxs.jpg

    select MIN(id) as ID, name, sex,

    sum(case when num=2 then 2 end) as num2,

    sum(case when num=3 then 3 end) as num3,

    sum(case when num=4 then 4 end) as num4,

    sum(case when num=5 then 5 end) as num5

    from 表名 group by name,sex

    SQL?Server?动态行转列

    c0eodnjnm0i.jpg

    一.本文所涉及的内容(Contents)

    本文所涉及的内容(Contents)

    背景(Contexts)

    实现代码(SQL Codes)

    方法一:使用拼接SQL,静态列字段;

    方法二:使用拼接SQL,动态列字段;

    方法三:使用PIVOT关系运算符,静态列字段;

    方法四:使用PIVOT关系运算符,动态列字段;

    二.背景(Contexts)

    其实行转列并不是一个什么新鲜的话题了,甚至已经被大家说到烂了,网上的很多例子多多少少都有些问题,所以我希望能让大家快速的看到执行的效果,所以在动态列的基础上再把表、分组字段、行转列字段、值这四个行转列固定需要的值变成真正意义的参数化,大家只需要根据自己的环境,设置参数值,马上就能看到效果了(可以直接跳转至:“参数化动态PIVOT行转列”查看具体的脚本代码)。行转列的效果图如图1所示:

    (图1:行转列效果图)

    三.实现代码(SQL Codes)

    (一) 首先我们先创建一个测试表,往里面插入测试数据,返回表记录如图2所示:

    --创建测试表

    IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[TestRows2Columns]') AND type in (N'U'))

    DROP TABLE [dbo].[TestRows2Columns]

    GO

    CREATE TABLE [dbo].[TestRows2Columns](

    [Id] [int] IDENTITY(1,1) NOT NULL,

    [UserName] [nvarchar](50) NULL,

    [Subject] [nvarchar](50) NULL,

    [Source] [numeric](18, 0) NULL

    ) ON [PRIMARY]

    GO

    --插入测试数据

    INSERT INTO [TestRows2Columns] ([UserName],[Subject],[Source])

    SELECT N'张三',N'语文',60 UNION ALL

    SELECT N'李四',N'数学',70 UNION ALL

    SELECT N'王五',N'英语',80 UNION ALL

    SELECT N'王五',N'数学',75 UNION ALL

    SELECT N'王五',N'语文',57 UNION ALL

    SELECT N'李四',N'语文',80 UNION ALL

    SELECT N'张三',N'英语',100

    GO

    SELECT * FROM [TestRows2Columns]

    (图2:样本数据)

    (二) 先以静态的方式实现行转列,效果如图3所示:

    --1:静态拼接行转列

    SELECT [UserName],

    SUM(CASE [Subject] WHEN '数学' THEN [Source] ELSE 0 END) AS '[数学]',

    SUM(CASE [Subject] WHEN '英语' THEN [Source] ELSE 0 END) AS '[英语]',

    SUM(CASE [Subject] WHEN '语文' THEN [Source] ELSE 0 END) AS '[语文]'

    FROM [TestRows2Columns]

    GROUP BY [UserName]

    GO

    (图3:样本数据)

    (三) 接着以动态的方式实现行转列,这是使用拼接SQL的方式实现的,所以它适用于SQL Server 2000以上的数据库版本,执行脚本返回的结果如图2所示;

    --2:动态拼接行转列

    DECLARE @sql VARCHAR(8000)

    SET @sql = 'SELECT [UserName],'

    SELECT @sql = @sql + 'SUM(CASE [Subject] WHEN '''+[Subject]+''' THEN [Source] ELSE 0 END) AS '''+QUOTENAME([Subject])+''','

    FROM (SELECT DISTINCT [Subject] FROM [TestRows2Columns]) AS a

    SELECT @sql = LEFT(@sql,LEN(@sql)-1) + ' FROM [TestRows2Columns] GROUP BY [UserName]'

    PRINT(@sql)

    EXEC(@sql)

    GO

    (四) 在SQL Server 2005之后有了一个专门的PIVOT 和 UNPIVOT 关系运算符做行列之间的转换,下面是静态的方式实现的,实现效果如图4所示:

    --3:静态PIVOT行转列

    SELECT *

    FROM ( SELECT [UserName] ,

    [Subject] ,

    [Source]

    FROM [TestRows2Columns]

    ) p PIVOT

    ( SUM([Source]) FOR [Subject] IN ( [数学],[英语],[语文] ) ) AS pvt

    ORDER BY pvt.[UserName];

    GO

    (图4)

    (五) 把上面静态的SQL基础上进行修改,这样就不用理会记录里面存储了什么,需要转成什么列名的问题了,脚本如下,效果如图4所示:

    --4:动态PIVOT行转列

    DECLARE @sql_str VARCHAR(8000)

    DECLARE @sql_col VARCHAR(8000)

    SELECT @sql_col = ISNULL(@sql_col + ',','') + QUOTENAME([Subject]) FROM [TestRows2Columns] GROUP BY [Subject]

    SET @sql_str = '

    SELECT * FROM (

    SELECT [UserName],[Subject],[Source] FROM [TestRows2Columns]) p PIVOT

    (SUM([Source]) FOR [Subject] IN ( '+ @sql_col +') ) AS pvt

    ORDER BY pvt.[UserName]'

    PRINT (@sql_str)

    EXEC (@sql_str)

    (六) 也许很多人到了上面一步就够了,但是你会发现,当别人拿到你的代码,需要不断的修改成他自己环境中表名、分组列、行转列字段、字段值这几个参数,逻辑如图5所示,所以,我继续对上面的脚本进行修改,你只要设置自己的参数就可以实现行转列了,效果如图4所示:

    --5:参数化动态PIVOT行转列

    -- =============================================

    -- Author:

    -- Create date: <2014.05.26>

    -- Description:

    -- Blog:

    -- =============================================

    DECLARE @sql_str NVARCHAR(MAX)

    DECLARE @sql_col NVARCHAR(MAX)

    DECLARE @tableName SYSNAME --行转列表

    DECLARE @groupColumn SYSNAME --分组字段

    DECLARE @row2column SYSNAME --行变列的字段

    DECLARE @row2columnValue SYSNAME --行变列值的字段

    SET @tableName = 'TestRows2Columns'

    SET @groupColumn = 'UserName'

    SET @row2column = 'Subject'

    SET @row2columnValue = 'Source'

    --从行数据中获取可能存在的列

    SET @sql_str = N'

    SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+'])

    FROM ['+@tableName+'] GROUP BY ['+@row2column+']'

    --PRINT @sql_str

    EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT

    --PRINT @sql_col

    SET @sql_str = N'

    SELECT * FROM (

    SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']) p PIVOT

    (SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt

    ORDER BY pvt.['+@groupColumn+']'

    --PRINT (@sql_str)

    EXEC (@sql_str)

    (图5)

    (七) 在实际的运用中,我经常遇到需要对基础表的数据进行筛选后再进行行转列,那么下面的脚本将满足你这个需求,效果如图6所示:

    --6:带条件查询的参数化动态PIVOT行转列

    -- =============================================

    -- Author:

    -- Create date: <2014.05.26>

    -- Description:

    -- Blog:

    -- =============================================

    DECLARE @sql_str NVARCHAR(MAX)

    DECLARE @sql_col NVARCHAR(MAX)

    DECLARE @sql_where NVARCHAR(MAX)

    DECLARE @tableName SYSNAME --行转列表

    DECLARE @groupColumn SYSNAME --分组字段

    DECLARE @row2column SYSNAME --行变列的字段

    DECLARE @row2columnValue SYSNAME --行变列值的字段

    SET @tableName = 'TestRows2Columns'

    SET @groupColumn = 'UserName'

    SET @row2column = 'Subject'

    SET @row2columnValue = 'Source'

    SET @sql_where = 'WHERE UserName = ''王五'''

    --从行数据中获取可能存在的列

    SET @sql_str = N'

    SELECT @sql_col_out = ISNULL(@sql_col_out + '','','''') + QUOTENAME(['+@row2column+'])

    FROM ['+@tableName+'] '+@sql_where+' GROUP BY ['+@row2column+']'

    --PRINT @sql_str

    EXEC sp_executesql @sql_str,N'@sql_col_out NVARCHAR(MAX) OUTPUT',@sql_col_out=@sql_col OUTPUT

    --PRINT @sql_col

    SET @sql_str = N'

    SELECT * FROM (

    SELECT ['+@groupColumn+'],['+@row2column+'],['+@row2columnValue+'] FROM ['+@tableName+']'+@sql_where+') p PIVOT

    (SUM(['+@row2columnValue+']) FOR ['+@row2column+'] IN ( '+ @sql_col +') ) AS pvt

    ORDER BY pvt.['+@groupColumn+']'

    --PRINT (@sql_str)

    EXEC (@sql_str)

    (图6)

    sql行转列

    lyh0h2u5v3i.jpg

    你的表从表面看无法转为你要的,你可以用case ... when 转成以下的

    select 任务id,业务单据id

    ,case 操作标识 when '入池'? then 操作时间? end as 入池时间

    ,case 操作标识 when '提取任务'? then 操作时间? end as 提取任务时间

    ,case? when 操作标识 in('退回提交人', '审核')? ?then 操作时间? ?end as 审核时间

    from task

    +----------+----------------+--------------+--------------------+--------------+

    | 任务id? ?| 业务单据id? ? ?| 入池时间? ? ?| 提取任务时间? ? ? ?| 审核时间? ? ?|

    +----------+----------------+--------------+--------------------+--------------+

    |? ? ? ? 1 | A? ? ? ? ? ? ? | 2020/4/25? ? | NULL? ? ? ? ? ? ? ?| NULL? ? ? ? ?|

    |? ? ? ? 2 | A? ? ? ? ? ? ? | NULL? ? ? ? ?| 2020/4/26? ? ? ? ? | NULL? ? ? ? ?|

    |? ? ? ? 3 | A? ? ? ? ? ? ? | NULL? ? ? ? ?| NULL? ? ? ? ? ? ? ?| 2020/4/27? ? |

    |? ? ? ? 4 | A? ? ? ? ? ? ? | 2020/4/28? ? | NULL? ? ? ? ? ? ? ?| NULL? ? ? ? ?|

    |? ? ? ? 5 | A? ? ? ? ? ? ? | NULL? ? ? ? ?| 2020/4/29? ? ? ? ? | NULL? ? ? ? ?|

    |? ? ? ? 6 | A? ? ? ? ? ? ? | NULL? ? ? ? ?| NULL? ? ? ? ? ? ? ?| 2020/4/30? ? |

    +----------+----------------+--------------+--------------------+--------------

    但因为你的

    入池时间? ? ?| 提取任务时间? ? ? ?| 审核时间

    没有关联性,所以无法合并你的数据

    Oracle行转列的SQL语句

    2y4uvdxaxvk.jpg

    oracle 测试通过

    Select std,

    Case When std=1 Then Min(f1) Else Max(f1)End f1,

    Max(f2) f2,

    Case When std=1 Then Max(f1) Else Min(f1) End f3,

    Min(f2) f4

    From table1 Group By std

    展开全文
  • MySQL 实现行转列SQL

    2021-01-18 19:07:14
    概述好久没写SQL语句,今天看到问答中的一个问题,拿来研究一下。情景简介学校里面记录成绩,每个人的...数据库表数据:处理后的结果(行转列):方法一:这里可以使用Max,也可以使用Sum;注意第二张图,当有学生的某...

    概述

    好久没写SQL语句,今天看到问答中的一个问题,拿来研究一下。

    情景简介

    学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不需要把所有课程当作列。数据表里面数据如下图,使用姓名+课程作为联合主键(有些需求可能不需要联合主键)。本文以MySQL为基础,其他数据库会有些许语法不同。

    数据库表数据:

    133999458_1_20180525084501378

    133999458_2_20180525084501566

    处理后的结果(行转列):

    133999458_3_20180525084501660

    133999458_4_20180525084501753

    方法一:

    这里可以使用Max,也可以使用Sum;

    注意第二张图,当有学生的某科成绩缺失的时候,输出结果为Null;

    SELECT

    SNAME,

    MAX(

    CASECNAME

    WHEN'JAVA'THEN

    SCORE

    END

    ) JAVA,

    MAX(

    CASECNAME

    WHEN'mysql'THEN

    SCORE

    END

    ) mysql

    FROM

    stdscore

    GROUPBY

    SNAME;可以在第一个Case中加入Else语句解决这个问题:

    SELECT

    SNAME,

    MAX(

    CASECNAME

    WHEN'JAVA'THEN

    SCORE

    ELSE

    0

    END

    ) JAVA,

    MAX(

    CASECNAME

    WHEN'mysql'THEN

    SCORE

    ELSE

    0

    END

    ) mysql

    FROM

    stdscore

    GROUPBY

    SNAME;方法二:

    SELECTDISTINCTa.sname,

    (SELECTscoreFROMstdscore bWHEREa.sname=b.snameANDb.CNAME='JAVA')AS'JAVA',

    (SELECTscoreFROMstdscore bWHEREa.sname=b.snameANDb.CNAME='mysql')AS'mysql'

    FROMstdscore a方法三:

    DROPPROCEDURE

    IF EXISTS sp_score;

    DELIMITER &&

    CREATEPROCEDUREsp_score ()

    BEGIN

    #课程名称

    DECLARE

    cname_n VARCHAR(20) ; #所有课程数量

    DECLARE

    countINT; #计数器

    DECLARE

    i INTDEFAULT0 ; #拼接SQL字符串

    SET@s ='SELECT sname';

    SETcount= (

    SELECT

    COUNT(DISTINCTcname)

    FROM

    stdscore

    ) ;

    WHILE i 

    SETcname_n = (

    SELECT

    cname

    FROM

    stdscore

    GROUPBYCNAME

    LIMIT i,

    1

    ) ;

    SET@s = CONCAT(

    @s,

    ', SUM(CASE cname WHEN ',

    '\'',

    cname_n,

    '\'',

    ' THEN score ELSE 0 END)',

    ' AS ',

    '\'',

    cname_n,

    '\''

    ) ;

    SETi = i + 1 ;

    END

    WHILE ;

    SET@s = CONCAT(

    @s,

    ' FROM stdscore GROUP BY sname'

    ) ; #用于调试

    #SELECT@s;

    PREPAREstmt

    FROM

    @s ; EXECUTEstmt ;

    END&&

    CALL sp_score () ;

    处理后的结果(行转列)分级输出:

    133999458_5_20180525084501863

    133999458_6_20180525084501941

    方法一:

    这里可以使用Max,也可以使用Sum;

    注意第二张图,当有学生的某科成绩缺失的时候,输出结果为Null;

    SELECT

    SNAME,

    MAX(

    CASECNAME

    WHEN'JAVA'THEN

    (

    CASE

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME='JAVA') > 20THEN

    '优秀'

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME='JAVA') > 10THEN

    '良好'

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME='JAVA') >= 0THEN

    '普通'

    ELSE

    '较差'

    END

    )

    END

    ) JAVA,

    MAX(

    CASECNAME

    WHEN'mysql'THEN

    (

    CASE

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME='JAVA') > 20THEN

    '优秀'

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME='JAVA') > 10THEN

    '良好'

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME='JAVA') >= 0THEN

    '普通'

    ELSE

    '较差'

    END

    )

    END

    ) mysql

    FROM

    stdscore

    GROUPBY

    SNAME;方法二:

    SELECTDISTINCTa.sname,

    (SELECT(

    CASE

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME='JAVA') > 20THEN

    '优秀'

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME='JAVA') > 10THEN

    '良好'

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME='JAVA') >= 0THEN

    '普通'

    ELSE

    '较差'

    END

    ) FROMstdscore bWHEREa.sname=b.snameANDb.CNAME='JAVA')AS'JAVA',

    (SELECT(

    CASE

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME='JAVA') > 20THEN

    '优秀'

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME='JAVA') > 10THEN

    '良好'

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME='JAVA') >= 0THEN

    '普通'

    ELSE

    '较差'

    END

    ) FROMstdscore bWHEREa.sname=b.snameANDb.CNAME='mysql')AS'mysql'

    FROMstdscore a方法三:

    DROPPROCEDURE

    IF EXISTS sp_score;

    DELIMITER &&

    CREATEPROCEDUREsp_score ()

    BEGIN

    #课程名称

    DECLARE

    cname_n VARCHAR(20) ; #所有课程数量

    DECLARE

    countINT; #计数器

    DECLARE

    i INTDEFAULT0 ; #拼接SQL字符串

    SET@s ='SELECT sname';

    SETcount= (

    SELECT

    COUNT(DISTINCTcname)

    FROM

    stdscore

    ) ;

    WHILE i 

    SETcname_n = (

    SELECT

    cname

    FROM

    stdscore

    GROUPBYCNAME

    LIMIT i, 1

    ) ;

    SET@s = CONCAT(

    @s,

    ', MAX(CASE cname WHEN ',

    '\'',

    cname_n,

    '\'',

    ' THEN(

    CASE

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME=\'',cname_n,'\') > 20THEN

    \'优秀\'

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME=\'',cname_n,'\') > 10THEN

    \'良好\'

    WHENSCORE - (selectavg(SCORE)fromstdscorewhereCNAME=\'',cname_n,'\') >= 0THEN

    \'普通\'

    ELSE

    \'较差\'

    END

    ) END)',

    ' AS ',

    '\'',

    cname_n,

    '\''

    ) ;

    SETi = i + 1 ;

    END

    WHILE ;

    SET@s = CONCAT(

    @s,

    ' FROM stdscore GROUP BY sname'

    ) ;

    #用于调试

    #SELECT@s;

    PREPAREstmt

    FROM

    @s ; EXECUTEstmt ;

    END&&

    CALL sp_score ();

    几种方法比较分析

    第一种使用了分组,对每个课程分别处理。

    第二种方法使用了表连接。第三种使用了存储过程,实际上可以是第一种或第二种方法的动态化,先计算出所有课程的数量,然后对每个分组进行课程查询。这种方法的一个最大的好处是当新增了一门课程时,SQL语句不需要重写。

    小结

    关于行转列和列转行

    这个概念似乎容易弄混,有人把行转列理解为列转行,有人把列转行理解为行转列;

    这里做个定义:

    行转列:把表中特定列(如本文中的:CNAME)的数据去重后做为列名(如查询结果行中的“Java,mysql”,处理后是做为列名输出);

    列转行:可以说是行转列的反转,把表中特定列(如本文处理结果中的列名“JAVA,mysql”)做为每一行数据对应列“CNAME”的值;

    关于效率

    不知道有什么好的生成模拟数据的方法或工具,麻烦小伙伴推荐一下,抽空我做一下对比;

    还有其它更好的方法吗?

    本文使用的几种方法应该都有优化的空间,特别是使用存储过程的话会更加灵活,功能更强大;

    本文的分级只是给出一种思路,分级的方法如果学生的成绩相差较小的话将失去意义;

    如果小伙伴有更好的方法,还请不吝赐教,感激不尽!

    有些需求可能不需要联合主键

    有些需求可能不需要联合主键,因为一门课程可能允许学生考多次,取最好的一次成绩,或者取多次的平均成绩。

    展开全文
  • 多行字符串 原数据 结果数据库 通过FOR XML PATH把skill按-拼接在一起(-缠绕-寄生-蛛网束缚),然后使用STUFF函数把第一个-符号去掉。 SQL Code select A.* into #result from ( select '唐三' as ...

    SqlServer多行转字符串

    原数据

    结果数据库

    通过FOR XML PATH把skill按-拼接在一起(-缠绕-寄生-蛛网束缚),然后使用STUFF函数把第一个-符号去掉。

    SQL Code

    select A.* 
    into #result
    from
    (
    	select '唐三' as name,'缠绕' as skill
    	union all
    	select '唐三' as name,'寄生' as skill
    	union all
    	select '唐三' as name,'蛛网束缚' as skill
    	union all
    	select '小舞' as name,'爆杀八段摔' as skill
    	union all
    	select '小舞' as name,'无敌金身' as skill
    ) A
    
    SELECT name,
    STUFF(
    (SELECT '-'+ A1.skill FROM #result A1 WHERE A1.name=A.name FOR XML PATH(''))
    ,1,1,''
    ) AS skill
    FROM #result A
    GROUP BY name
    order by name
    
    drop table #result

    SqlServer字符串多行转

    原数据

    结果数据库

    通过CONVERT(xml,'<root><v>' + REPLACE(A.skill, '-', '</v><v>') + '</v></root>')把skill转换成xml文档,再通过OUTER APPLY把xml转成多行,并通过A.skill.nodes('/root/v') N(v)取到xml中拆分好的节点数据。

    SQL Code

    select A.* 
    into #result
    from
    (
    	select '唐三' as name,'缠绕-寄生-蛛网束缚' as skill
    	union all
    	select '小舞' as name,'爆杀八段摔-无敌金身' as skill
    ) A
    
    select A.name,B.skill from
    (
    select A.name,skill=CONVERT(xml,'<root><v>' + REPLACE(A.skill, '-', '</v><v>') + '</v></root>')
    from #result A
    )A
    OUTER APPLY(
    SELECT skill = N.v.value('.', 'varchar(100)') FROM A.skill.nodes('/root/v') N(v)
    )B
    
    drop table #result
    

    Oracle字符串多行转

    原数据

    结果数据库

    SQL Code

    select distinct * from (
    select  name,regexp_substr(A.skill, '[^-]+', 1, Level,'i') skill
      from (
      select '唐三' as name,'缠绕-寄生-蛛网束缚' as skill from dual
      union all
      select '小舞' as name,'爆杀八段摔-无敌金身' as skill from dual
      ) A
    connect by Level <= LENGTH(A.skill) - LENGTH(REGEXP_REPLACE(A.skill, '-', '')) + 1) order by name;

    SqlServer查询当前库所有存储是否包含某个表

    SELECT ROUTINE_NAME, ROUTINE_DEFINITION
    FROM INFORMATION_SCHEMA.ROUTINES
    WHERE ROUTINE_DEFINITION LIKE '%表名%'
    AND ROUTINE_TYPE='PROCEDURE'

     

    展开全文
  • 行转列 select jcxm, isnull([2020-01],0) [2020-01], isnull([2020-02],0) [2020-02], isnull([2020-03],0) [2020-03], isnull([2020-04],0) [2020-04], isnull([2020-05],0) [2020-05], isnull([2020-06],0) [2020...

    行转列

    select jcxm,
    isnull([2020-01],0) [2020-01],
    isnull([2020-02],0) [2020-02],
    isnull([2020-03],0) [2020-03],
    isnull([2020-04],0) [2020-04],
    isnull([2020-05],0) [2020-05],
    isnull([2020-06],0) [2020-06],
    isnull([2020-07],0) [2020-07],
    isnull([2020-08],0) [2020-08],
    isnull([2020-09],0) [2020-09],
    isnull([2020-10],0) [2020-10],
    isnull([2020-11],0) [2020-11],
    isnull([2020-12],0) [2020-12]
     from(
    select jcxm,ym,pjnd from V_ZTTJ_JCXM_MIC 
    )as u
    pivot(max(pjnd) for ym in([2020-01],[2020-02],[2020-03],[2020-04],[2020-05],[2020-06],[2020-07],[2020-08],[2020-09],[2020-10],[2020-11],[2020-12])
    )as e;
    --注意:pivot后必须跟max或min等函数,不能直接写字段名
    

    列转行

    SELECT FSX,TYPE,VAL  FROM ( 
    SELECT TYPE, VAL FROM (
    SELECT FXY1,FXY2
    from TABLE_A EVA
    LEFT JOIN TABLE_B ENT ON EVA.SP_ID = ENT.id
    LEFT JOIN TABLE_C JBXX ON JBXX.ID = ENT.enterId
    WHERE EVA.delFlag = 0 
    AND EVA.SJZT = 2
     ) AS A  UNPIVOT ( VAL FOR TYPE IN ( FXY1,FXY2
     )  )  AS B
    ) SAN 
    LEFT JOIN TABLE_D CONF ON CONF.ZDM = SAN.TYPE
    ORDER BY CONF.[INDEX] ASC

    展开全文
  • 问题链接:关于Mysql 的分级输出问题 情景简介 学校里面记录成绩,每个人的选课不一样,而且以后会添加课程,所以不...处理后的结果(行转列): 方法一: 这里可以使用Max,也可以使用Sum; 注意第二张图,
  • 1: 行转列子查询,获取一定数据集结果SELECT objid,action,count(1) AS [count] FROM T_MyAttention WHERE objid IN(SELECT TOP 10 objid FROM T_MyAttention tma GROUP BY objid ORDER BY count(1) DESC)GROUP BY ...
  • 行转列,老生常谈的问题。这里总结一下网上的方法。1、生成测试数据:CREATE TABLEhuman(nameNVARCHAR(5), --姓名norm NVARCHAR(5), --指标score INT , --分数grade NVARCHAR(2) --等级)GOINSERT INTO human(name,...
  • 这篇文章主要为大家详细介绍了sql动态行转列的两种方法,具有一定的参考价值,可以用来参考一下。感兴趣的小伙伴,下面一起跟随512笔记的小编两巴掌来看看吧!第一种方法:代码如下:select *from ( select Url,case ...
  • Mysql-sql行转列

    2021-01-18 19:23:02
    参考网址https://www.cnblogs.com/ShaYeBlog/p/3594517.html ================================================================================================================ 三月的时候就遇到了行转列。...
  • 文章目录SQL sql语句实现行转列的3种方法系列文章目录前言第一种方式:静态行转列第二种方式:用povit行转列第三种方式:用存储过程行转列 前言 将列值旋转为列名(即行转列)是我们在开发中经常会遇到的一个需要,...
  • SQL行转列

    2021-03-08 21:02:26
    1.行转列1.经典案例:新建一个数据表create table STUDENT_SCORE(name VARCHAR2(20),subject VARCHAR2(20),score NUMBER(4,1))insert into student_score (NAME, SUBJECT, SCORE) values ('张三', '语文', 78.0);...
  • SQL实现行转列的两种方式 在我们日常开发的场景中,可能会遇到使用SQL进行行转列的问题,那么下面我将介绍两种方式供大家参考。大家只要认真看完,我想肯定会学会这两种简单的方法的! 首先我们准备一张数据表:my_...
  • SQL行转列Pivot函数

    2021-01-18 19:23:03
    未来的一个月时间中,会总结一系列SQL知识点,一次只总结一个知识点,尽量说明白,下面来说说SQL 中常用Pivot 函数(这里是用的数据库是SQLSERVER,与其他数据库是类似的,大家放心看就好)让我们先从一个虚构的场景中...
  • oracle SQL 转换

    2021-01-16 16:03:38
    oracle SQL竖表转横表(行转列)T_T_STUDENT表查询记录如下,要转成横表姓名 课程 成绩1 张飞 语文 802 张飞 数学 873 关羽 语文 974 张飞 英语 685 关羽 数学 536 刘备 语文 90create t...
  • SQL语句如下: select year as 年份,[1] as 第一季度,[2] as 第二季度,[3] as 第三季度,[4] as 第四季度 from (select year,jidu,jine from sales) as t1 pivot (SUM(jine) FOR jidu IN ([1],[2],[3],[4])) as a --...
  • 原标题:有趣的SQL(四) 行转列的复杂应用和优化思想导读本文节选自松华老师《SQL优化专栏》大家好,我是知数堂SQL 优化班老师 网名:骑龟的兔子在之前的的系列文章:有趣的SQL(三)行转列,列转行和复制已经给大家...
  • 在Hive sql应用中会遇到“行转列”和“列转行”的场景,下面介绍其基本使用语法。 1.行转列: 关键字:collect_set() / collect_list()、concat_ws() 1)collect_set()/collect_list():collect_set( )函数只接受...
  • PIVOT用于将列值旋转为列名(即行转列)语法:table_sourcePIVOT(聚合函数(value_column)FOR pivot_columnIN())UNPIVOT用于将列明转为列值(即列转行)语法:table_sourceUNPIVOT(value_columnFOR pivot_columnIN())注意...
  • 行转列: 创建数据库表结构为:表名tmp tabtype 为产品类型,构建 有产品表,分别对应A,B,C,D...获取行转列sql: select batchdate, datetype, sum(decode(tabtype, '1', amount, 0)) amount1, sum(dec...
  • 目录结构如下:行转列列转行[一]、行转列1.1、初始测试数据表结构:TEST_TB_GRADESql代码create table TEST_TB_GRADE(ID NUMBER(10) not null,USER_NAME VARCHAR2(20 CHAR),COURSE VARCHAR2(20 CHAR),SCORE FLOAT)...
  • 目录一、多行转成一列(并以","隔开)二、一列转成多行三、行转列1、建立表格2、使用SQL Server 2000静态SQL四、行转列结果加上总分、平均分1、使用SQL Server 2000静态SQL2、使用SQL Server 2000动态SQL3、使用SQL ...
  • SQLSERVER行转列 列转行

    2021-03-01 16:24:53
    1.行转列 将项目表的ApplySys 拆分为多条数据 SELECT ApplySys , * FROM p_project SELECT * FROM dbo.myApplication –行转列 SELECT ProjGuid,ApplySys,c.ApplicationName FROM ( SELECT A.ProjGuid, B.ApplySys ...
  • SQL查询行转列

    2021-03-04 04:22:14
    ---1、最简单的行转列/*问题:假设有张学生成绩表(tb)如下:姓名 课程 分数张三 语文 74张三 数学 83张三 物理 93李四 语文 74李四 数学 84李四 物理 94想变成(得到如下结果):姓名 语文 数学 物理李四 74 84 94张三 ...
  • SQLSERVER :行列转换例子: http://www.cnblogs.com/gaizai/p/3753296.html#_labelFour1. Oracle 11g...2. 在Oracle 10g及以前版本,一般是通过各种SQL进行行列转换,列入下面例子:create or replace procedure ...
  • 一、多行成一(并以","隔开)表名:A表数据:想要的查询结果:查询语句:SELECTname ,value= ( STUFF(( SELECT ',' +valueFROMAWHERE name =Test.nameFORXML PATH('')),1, 1, '') )FROM A ASTestGROUP BY name;...
  • 在我们使用的数据库表中经常需要用到行列互相转换的情况,使用sql 的关键词UNPIVOT(列转行)和PIVOT(行转列)可轻松实现行列转换。一、列转行:员工月份排班表存储是采用1号~31号作为列的方式进行存储的现通过UNPIVOT ...
  • drop table ABC;create table ABC(id number,name varchar2(50),kcName varchar2(50),score number);insert into ABC values(1,'张三','语文',88);insert into ABC values(2,'张三','数学',68);...
  • 在不知道PIVOT关系运算符的用法之前,我们通过聚合函数配合CASE……WHEN的写法来实现相应的功能,微软在Sql Server 2005以及更高版本中提供能PIVOT关系运算符,POVIT提供的语法比一系列的SELECT……CASE语句中所指定...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 222,962
精华内容 89,184
关键字:

行转列sql