SQL Server 将子记录添加到新列而不是新行

e1xvtsh3  于 2023-01-25  发布在  其他
关注(0)|答案(4)|浏览(213)

每个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

我怎样才能得到这些结果呢?
先谢谢你,感谢你的帮助。

wgx48brx

wgx48brx1#

您可以使用条件聚合透视多个列

select 
   id
   ,max(case rn when 1 then FirstName end) FirstName1
   ,max(case rn when 1 then LastName end) LastName1
   ,max(case rn when 2 then FirstName end) FirstName2
   ,max(case rn when 2 then LastName end) LastName2
  -- ..
from (
  select *, row_number() over(partition by id order by FirstName ) rn
  from #temp1) t
group by id
;
fdx2calv

fdx2calv2#

如果您实际想要的是一个包含所有具有id的用户的列表--(一个常见的用例),那么您应该这样做

SELECT ID, STRING_AGG(FirstName + ' ' + LastName, ', ') as Names
FROM #temp1
GROUP BY ID
mf98qq94

mf98qq943#

我不会给你完整的源代码,这是一个大的工作,但我会提供的步骤,你将需要得到通过

找出列数

您需要一个变量,我将其命名为cnt,它将保存表中select max(count(1))的结果,按ID分组。

在使用索引循环到cnt之前

  • selectClause初始化为ID, t1.FirstName as FirstName, t1.LastName as LastName
  • fromClause初始化为from yourtable t1
  • 将索引初始化为2(我们已经处理了第一个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

递增索引

别忘了这么做:)

一旦循环完成

连接selectClausefromClause,不要忘记在连接后追加group by ID,现在查询就准备好了。

运行动态查询

您可以使用EXECsp_executesql来实现这一点。
危险

6yoyoihd

6yoyoihd4#

感谢大家回答我的问题。我能够通过创建SSRS矩阵报告并按行(ID)分组和按列分组(所有其他列都需要成为组的一部分)来解决这个问题。感谢@Hogan提出SSRS报告的想法。

相关问题