每个ID可以有许多重复的行,如左侧第一个表所示,要求是将相同ID的“子”记录放在同一行上,并重复列标题,如右表所示。
我正在SQL Server中尝试这样做,以下是我的尝试:
if Object_id('tempdb..#temp1') is not null
Begin
drop table #temp1
End
create table #temp1 (
ID integer, FirstName varchar(50), LastName varchar(50)
)
insert into #temp1 values (25,'Abby','Mathews');
insert into #temp1 values (25,'Jennifer','Edwards');
insert into #temp1 values (26,'Peter','Williams');
insert into #temp1 values (27,'John','Jacobs');
insert into #temp1 values (27,'Mark','Scott');
Select * From #temp1;
With Qrt_CTE (ID, FirstName, LastName)
AS
(
SELECT ID, FirstName, LastName
FROM #temp1 AS BaseQry
)
SELECT ID, ColumnName, ColumnValue INTO #temp2
FROM Qrt_CTE
UNPIVOT
(
ColumnValue FOR ColumnName IN (FirstName, LastName)
) AS UnPivotExample
Select * From #temp2
我怎样才能得到这些结果呢?
先谢谢你,感谢你的帮助。
4条答案
按热度按时间wgx48brx1#
您可以使用条件聚合透视多个列
fdx2calv2#
如果您实际想要的是一个包含所有具有id的用户的列表--(一个常见的用例),那么您应该这样做
mf98qq943#
我不会给你完整的源代码,这是一个大的工作,但我会提供的步骤,你将需要得到通过
找出列数
您需要一个变量,我将其命名为
cnt
,它将保存表中select max(count(1))
的结果,按ID
分组。在使用索引循环到
cnt
之前selectClause
初始化为ID, t1.FirstName as FirstName, t1.LastName as LastName
fromClause
初始化为from yourtable t1
t1
)对于每个步骤:
附加所选内容:
将
, t<i>.FirstName as FirstName, t<i>.LastName as LastName
追加到selectClause
,其中<i>
是当前索引值(将其替换为实际索引名称)。可以使用CONCAT
连接变量和文本块,并且可以通过多种方式将整数转换为数字,请参阅以下示例:https://www.w3schools.com/sql/func_sqlserver_convert.asp追加表格
将
left join yourtable t<i> on t<i-1>.ID = t<i>.ID and CONCAT(t<i-1>.FirstName, t<i-1>.LastName) < CONCAT(t<i>.FirstName, t<i>.LastName)
追加到fromClause
递增索引
别忘了这么做:)
一旦循环完成
连接
selectClause
和fromClause
,不要忘记在连接后追加group by ID
,现在查询就准备好了。运行动态查询
您可以使用EXEC或sp_executesql来实现这一点。
危险
6yoyoihd4#
感谢大家回答我的问题。我能够通过创建SSRS矩阵报告并按行(ID)分组和按列分组(所有其他列都需要成为组的一部分)来解决这个问题。感谢@Hogan提出SSRS报告的想法。