在SQL Server中将包含不同数据的列转换为多行

我有一张从excel表格导入的表格。 对于高级SQL,我是相当新的。

第一列(账户号码)按顺序包含对应于该列的前三行的账户号码,账户date和名称。 该列的下3行包含不同用户的相同types的信息。

第二列(金额)包含金额,百分比增加,到期金额,对应于该列的下3行等等。

导入当前表结构: 导入的表格

我想知道如何将这些值转换为具有以下结构的不同表格:账户号码,账户date,名称,金额,增加的百分比,到期金额。

预期产出表:

预期的表格

我曾尝试使用交叉应用,但我没有成功做到这一点。 我也尝试在SQL Server中使用PIVOT。 然而,我遇到的例子和解决scheme有列包含相同types的数据。

SELECT [Account Number] FROM SourceTable AS T1 PIVOT ( -- AGGREGATE FUNCTION FOR [Account Number] IN ( [Account Number],[Date], [Name] ) ) AS T2 

请让我知道如何继续这一点。

这是一个真正可怕的数据结构,至less可以说。 你有三行需要成为单行。 这是最好的丑陋。 更糟糕的是,你必须至less在开始时将所有的数据types都作为varchar存储起来,因为你有各种各样的数据types。 你可以在这里使用一些条件聚合。 第一步是以我们可以使用的格式提供样本数据。

 if OBJECT_ID('tempdb..#Something') is not null drop table #Something create table #Something ( SomethingID int identity , SomeValue varchar(50) , SomeOtherValue int ) insert #Something values ('1111', 10000) , ('10/31/2017', 1) , ('John Smith', 100) , ('2222', 20000) , ('10/31/2017', 1) , ('Jane Doe', 200) ; 

现在我们必须有点棘手。 我把它分成了多个步骤,这样你就可以看到发生了什么事情。 第一步是为每组三个行分配一个组号。 那么我们需要对每个组中的每一行进行重新编号,这样我们就可以知道给定行所在的组中的哪一行。 这就是为什么有一个订单列是如此重要。 然后最后一步是使用条件聚合来将这个灾难分析到你想要的列。

 with SortedValues as ( select * , row_number() over(order by SomethingID) as RowNum , case SomethingID % 3 when 1 then (SomethingID + 2) / 3 when 2 then (SomethingID + 1) / 3 when 0 then SomethingID / 3 end as GroupNumber from #Something ) , GroupedOrdering as ( select * , ROW_NUMBER() over(partition by GroupNumber order by RowNum) as GroupRowNum from SortedValues ) select AccountNumber = max(case when GroupRowNum = 1 then SomeValue end) , MyDate = max(case when GroupRowNum = 2 then SomeValue end) , AccountName = max(case when GroupRowNum = 3 then SomeValue end) , Amount = max(case when GroupRowNum = 1 then SomeOtherValue end) , MyPercentage = max(case when GroupRowNum = 2 then SomeOtherValue end) , AmountDue = max(case when GroupRowNum = 3 then SomeOtherValue end) from GroupedOrdering group by GroupNumber 

我会build议改变这个表格结构,如果可能的话,因为这是一个噩梦的工作。 而且你还有一些工作要做,因为数据types已经遍布全球。 希望这可以让你足够接近,你可以完成这个。