行转列问题(案例)

栏目: 数据库 · 发布时间: 7年前

内容简介:有网友在网上问:数据如下:期望得到的结果:

有网友在网上问:

数据如下:

number  createdate                         username         caseno
1       2018-05-29 18:57:54.150    戴婷                 201708220028
2      2018-07-04 14:28:40.167    戴婷                 201708220028
3     2019-01-02 11:34:53.533    戴婷         201708220028
4     2019-01-16 18:17:01.313    戴婷                201708220028

期望得到的结果:

username   caseno                     createdate1                             createdate2                           createdate3                         createdate4
戴婷               201708220028          2018-05-29 18:57:54.150      2018-07-04 14:28:40.167       2019-01-02 11:34:53.533     2019-01-16 18:17:01.313

下面是Insus.NET实现方法:

创建一个临时表,将用来存储最终结果:

行转列问题(案例)


IF OBJECT_ID('tempdb..#TempRpt') IS NOT NULL DROP TABLE #TempRpt   
CREATE TABLE #TempRpt
(   
    [caseno] bigint,
    [username] nvarchar(20)
)        

SELECT [caseno],[username] FROM #TempRpt   

Source Code

接下来,参考这篇《 数据表列值转换为逗号分隔字符串 》 https://www.cnblogs.com/insus/p/10848578.html

行转列问题(案例)


DECLARE @cols NVARCHAR(MAX)
EXECUTE[dbo].[usp_DateColumnToCommaDelimitedString] #T,createdate,@cols OUTPUT

Source Code

再接下来,再参考另外一篇《 动态为表添加存储时间字段 》 https://www.cnblogs.com/insus/p/10943614.html

行转列问题(案例)


EXECUTE [dbo].[usp_DyanmicallyAddStorageDatetimeField] 'tempdb','dbo','#TempRpt',@cols    

EXECUTE('SELECT [caseno],[username],'+ @cols +' FROM #TempRpt')

Source Code

一切准备好,我们可以开始处理原始数据:

行转列问题(案例)


DECLARE @r INT = 1,@rs INT = 0
SELECT @rs = MAX([number]) FROM #T

WHILE @r <= @rs
BEGIN
    DECLARE @COLUMN_NAME SYSNAME,@createdate datetime,@username nvarchar(20),@caseno bigint
    SELECT @COLUMN_NAME = CONVERT(VARCHAR(30),[createdate], 23),@createdate = [createdate],@username = [username],@caseno = [caseno] FROM #T WHERE [number] = @r


    IF EXISTS(SELECT TOP 1 1 FROM #TempRpt WHERE [caseno] = @caseno)
        EXECUTE('UPDATE #TempRpt SET ['+ @COLUMN_NAME +']  = '''+ @createdate +''' WHERE [caseno] = '''+ @caseno +'''' )
    ELSE
        EXECUTE('INSERT INTO #TempRpt ([caseno],[username],['+ @COLUMN_NAME +']) VALUES('''+ @caseno +''',N'''+ @username +''','''+ @createdate +''')')    

    SET @r = @r + 1
END

EXECUTE('SELECT [caseno],[username],'+ @cols +' FROM #TempRpt')

Source Code

到此,应该已经可以结束了。达到想要的结果。

扩展,Insus.NET添加多笔不同username ,caseno数据行,

但同一username ,caseno记录中,有重复的记录

行转列问题(案例)

程序还是使用上面的程序,也均能得到预期的结果。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。

创新者

创新者

[美] 沃尔特 · 艾萨克森 / 关嘉伟、牛小婧 / 中信出版社 / 2016-6 / 88.00

讲述了计算机和互联网从无到有的发展历程,并为我们生动地刻画出数字时代的创新者群像。 在近200年的数字化进程中群星闪耀,艾萨克森从一个计算机程序的创造者、诗人拜伦之女埃达说起,细数了这一群站在科学与人文交叉路口的创新者,他们包括通用型电子计算机的创造者奠奇利、科学家冯·诺依曼、仙童半导体公司的“八叛逆”、天才图灵、英特尔的格鲁夫、微软的比尔·盖茨、苹果公司的乔布斯、谷歌的拉里·佩奇等。《创新......一起来看看 《创新者》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换