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
- 删除每个 ID 的重复值(参见 ID=2245873),
- 在一行中列出与每个 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 !
我想更改我的数据:
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 |
- 删除每个 ID 的重复值(参见 ID=2245873),
- 在一行中列出与每个 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 !