有網友在網上問:html
數據以下:ide
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
指望獲得的結果:post
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實現方法:
url
建立一個臨時表,將用來存儲最終結果:spa
IF OBJECT_ID('tempdb..#TempRpt') IS NOT NULL DROP TABLE #TempRpt CREATE TABLE #TempRpt ( [caseno] bigint, [username] nvarchar(20) ) SELECT [caseno],[username] FROM #TempRpt
接下來,參考這篇《數據表列值轉換爲逗號分隔字符串》http://www.javashuo.com/article/p-yxqwruzx-ge.html3d
改寫一下:code
SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO -- ============================================= -- Author: Insus.NET -- Create date: 2019-05-29 -- Update date: 2019-05-29 -- Description: 時間表列值轉換爲逗號分隔字符串 -- ============================================= CREATE PROCEDURE [dbo].[usp_DateColumnToCommaDelimitedString] ( @TableName SYSNAME, @DateColumn SYSNAME, @Comma_Delimited_String NVARCHAR(MAX) OUTPUT ) AS BEGIN DECLARE @query NVARCHAR(MAX) = N'SET @Comma_Delimited_String = STUFF((SELECT DISTINCT '','' + QUOTENAME(CAST('+ @DateColumn +' AS DATE)) FROM '+ @TableName +' FOR XML PATH(''''), TYPE ).value(''.'', ''NVARCHAR(MAX)'') ,1,1,'''')' EXECUTE sp_executeSql @query, N'@Comma_Delimited_String AS NVARCHAR(MAX) OUTPUT',@Comma_Delimited_String OUTPUT END GO
運行示例,並獲得結果:htm
DECLARE @cols NVARCHAR(MAX) EXECUTE[dbo].[usp_DateColumnToCommaDelimitedString] #T,createdate,@cols OUTPUT
再接下來,再參考另一篇《動態爲表添加存儲時間字段》http://www.javashuo.com/article/p-kfivrsds-v.htmlblog
EXECUTE [dbo].[usp_DyanmicallyAddStorageDatetimeField] 'tempdb','dbo','#TempRpt',@cols EXECUTE('SELECT [caseno],[username],'+ @cols +' FROM #TempRpt')
一切準備好,咱們能夠開始處理原始數據:ip
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')
到此,應該已經能夠結束了。達到想要的結果。
擴展,Insus.NET添加多筆不一樣username ,caseno數據行,
但同一username ,caseno記錄中,有重複的記錄
程序仍是使用上面的程序,也均能獲得預期的結果。