SQL 合并重复行

SQL Merge duplicate rows

我想更改我的数据:

ID Date
2245873 03-JAN
2245873 03-JAN
2245873 04-JAN
8394313 03-JAN
8394313 04-JAN
8394313 05-JAN
3446512 31-DEC
3446512 20-JAN
617828 31-DEC
617828 03-JAN
617828 20-JAN
61342 02-JAN

对此:

ID date1 date2 date3
2245873 03-JAN 04-JAN
8394313 03-JAN 04-JAN 05-JAN
3446512 31-DEC 20-JAN
617828 31-DEC 03-JAN 20-JAN
61342 02-JAN
  1. 删除每个 ID 的重复值(参见 ID=2245873),
  2. 在一行中列出与每个 ID 关联的日期,

我不知道每个 ID 有多少个日期,所以我需要的列数未知,这可能吗?

我还需要能够将这个新的 table 与另一个合并,所以它需要是一个视图或更改 table?

如果没有更多日期与 ID 关联,我希望该单元格为空

Table 姓名:dbo.rem

这个有用吗?

尝试做一个类似于上面链接的另一个 post 的动态 PIVOT,但是添加一个使用 'Day' 作为字符串和 DENSE_RANK 的字段来确定输出列(Date1,日期 2、日期 3...)

这既用于设置@cols 变量,也用于括号内的 SELECT 语句 - 结果字段命名为 [xdate]。

旋转时,这些值会作为列名称显示在您的原始 ID 旁边,然后填充与该 ID 相关的特定日期...希望如此!

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT DISTINCT ',' + QUOTENAME('Date'+ CAST(DENSE_RANK() OVER (PARTITION BY [ID] ORDER BY [date]) AS VARCHAR(MAX)) ) 
                    from sourcetable yt
                    group by [ID], [date]
                    
                 
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT [ID],' + @cols + ' from 
             (
                select [ID], [Date], ''Date''+ CAST(DENSE_RANK() OVER (PARTITION BY [ID] ORDER BY [date]) AS VARCHAR(MAX)) as [xdate]
                from sourcetable yt
            ) x
            pivot 
            (
                MAX([date] )
                for  [xdate] in (' + @cols + ')
            ) p '
            

    

EXECUTE(@query)
GO

我从下面的答案中获取了动态数据透视列形成部分

dynamic pivot query

下面的逻辑应该可行

declare @tbl table(id int, date varchar(50))

insert into @tbl values(2245873,'03-Jan')
,(2245873,'03-Jan'),(2245873,'04-Jan')
,(8394313,'03-Jan'),(8394313,'05-Jan'),(8394313,'07-Jan')

select distinct * into #temp
--,ROW_NUMBER()over(order by id) rownum
from @tbl

-- This part is to generate row numbers and form the dates

select id,date,
'date' + convert(varchar,rownum) as 'datetobepivoted' into #temp1
from(
select *,ROW_NUMBER()over(partition by id order by id) rownum from #temp
)t


declare @pivotcolstbl varchar(200) = (STUFF((SELECT distinct ',isnull(' + QUOTENAME(c.datetobepivoted) + ', '''') ' + c.datetobepivoted 
            FROM #temp1 c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,''))


declare @pivotcols varchar(200) = (STUFF((SELECT distinct ',' + QUOTENAME(c.datetobepivoted) 
            FROM #temp1 c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,''))

declare @query varchar(max)

set @query = '
SELECT id, ' + @pivotcolstbl + ' from 
(select id,date,datetobepivoted from #temp1)t
pivot(
max(date) for datetobepivoted in (' + @pivotcols + '))t1
'
exec(@query)

drop table #temp
drop table #temp1

注意:最大聚合函数也适用于 varchar !