在SQL Server中随机合并相同列的值

时间:2018-02-20 18:53:31

标签: sql sql-server

我有一张名字和他们的性别表:

+------------+----------+-------+
| id         | name     | gender|
+------------+----------+-------+
|         1  | James    |     M |
|         2  | Tom      |     M |
|         3  | Bill     |     M |
|         4  | Philip   |     M |
|         5  | Steve    |     M |
+------------+----------+-------+

我想要这个结果:

+------------+--------------------+
|     id     | name               |
+------------+--------------------+
|         1  | James Steve        |
|         2  | Tom Philip         |
|         3  | Steve James        |
|         4  | Bill Tom           |
|         5  | Steve Tom          |
+------------+--------------------+ 

它应该从列中选择任何随机名称,并将其与同一列中的另一个值合并。

作者对评论的解释:

我希望将列中的任意随机名称与来自同一列的其他随机名称连接起来,并通过组合这两个值生成新名称。

我从未将同一列中的两个值合并在一起

2 个答案:

答案 0 :(得分:1)

在SQL中做的很奇怪,但是你走了:

--some example data
declare @X table(name varchar(10))
insert into @X values ('Jim'), ('Tom'), ('Jerry'), ('Mickey')

;with cte as (
select row_number() over (order by ABS(CHECKSUM(NewId()))) [random_rn],
       row_number() over (order by name) [rn],
       name
from @X)

select c1.name + ' ' + c2.name from cte c1 join cte c2 on c1.rn = c2.random_rn

答案 1 :(得分:0)

SQL DEMO

您可以使用以下内容:

select id, name + ' ' + 
    (select top 1 name from Table1 where name<>t1.name ORDER BY NEWID()) AS Name 
from Table1 t1

在上面的查询中NEWID()为每一行生成一个GUID,因为GUID非常随机,排序意味着您以随机顺序获取记录,并使用top 1选择第一个。因此,在上面的查询中,它将选择一个当前名称以外的名称,并将其与当前名称合并。