【发布时间】:2017-10-26 10:53:08
【问题描述】:
我试图找到答案,但我发现的任何东西都不适用于我的情况,因此我将不胜感激:
场景:我的客户在一个表中具有 ID 和个人信息,然后我在另一个表中指示属于这些 ID 的注释。 当我加入表格时,我会在多行中得到多个注释。如下图。
T1. ID -T1. Name -T1. Birthday -T2. Note -Row number
2 -Peter -11/20/1990 -deciding -1
2 -Peter -11/20/1990 -purchased -2
3 -David -12/22/1962 -Presentation scheduled -1
3 -David -12/22/1962 -Presentation completed -2
3 -David -12/22/1962 -Purchased -3
4 -Anna -5/07/1992 -Ignored -1
我一直在徘徊的是如何在第一行的末尾添加注释 2 和 3 并消除重复项?
T1. ID -T1. Name -T1. Birthday -T2. Note -Note_2 -Note_3
2 -Peter -11/20/1990 -deciding -purchased
3 -David -12/22/1962 -Presentation scheduled -Presentation -completed Purchased
4 -Anna -5/07/1992 -Ignored -Null -Null
您可以使用此查询来查看表格:
declare @t1 table ( ID int not null,
Name varchar (50),
birthday date)
declare @t2 table (ID int not null,
Note nvarchar(max))
insert into @t1 values ( 2 , 'Peter' , '11/20/1990')
insert into @t1 values ( 3 , 'David' ,'12/22/1962')
insert into @t1 values ( 4 , 'Anna' , '5/07/1992')
insert into @t2 values (2 , 'deciding')
insert into @t2 values (2 ,'purchased')
insert into @t2 values (3 ,'Presentation scheduled')
insert into @t2 values (3 ,'Presentation completed')
insert into @t2 values (3 ,'Purchased')
insert into @t2 values (4 ,'Ignored')
SELECT *
, ROW_NUMBER() OVER (PARTITION BY t1.ID ORDER BY t2.id) AS 'ROW NUMBER'
FROM @t1 as t1
left outer join @t2 AS t2 ON t1.ID = t2.ID
【问题讨论】:
-
查看您的 SQL 代码添加查看
declare @t1 table和ROW_NUMBER() OVER (PARTITION BY和@t1我相信您使用的是 SQL-server 而不是 MySQL。所以请更正你的标签。 -
基本上使用 ROW_NUMBER() 为每个用户创建递增的 id,然后使用 PIVOT 或条件聚合将它们放在一起。我的一个问题是,你是否总是有 x# 的笔记,换句话说,它总是 3 或更少吗?如果您想要包含动态的最大注释数,则需要使用动态 SQL 和 Pivot/条件聚合来实现
-
@Matt 非常感谢您的帮助Matt,数量可以增加,不限于1-3。我对动态 SQL 了解不多,最近才开始研究这个概念。如果您能向我推荐好的资源,我将不胜感激。
-
取决于您使用的平台? sql服务器?我会搜索您的平台动态枢轴,您应该会找到一些参考资料。它的关键是在按用户分区的笔记表上创建一个 ROW_NUMBER。但要小心,你真的不想在列中太宽,所以你可能想要一个最大值,这样它就不会变得疯狂。此外,您可能会考虑将备注记录连接到 1 个字段的备注字段,但我想这取决于您的使用
-
@PedramSalamati 考虑使用链接问题的答案作为灵感。应该能够将该答案应用于 t2,然后再添加一条动态 sql 语句,通过将 t1 连接到您的旋转 t2 来获得最终输出。 (stackoverflow.com/questions/37468417/…)
标签: sql sql-server tsql join