将父/子关系记录展平为SQL中的1行(已更新)

时间:2020-04-09 23:18:52

标签: sql sql-server ssis etl

我在同一订单号上最多有3条记录(单击下面的链接以查看图像)。我需要将其展平为1行,因为我的目标表具有非规范化(展平)架构。我需要对所有三组都执行此操作– firstcolX,secondcolX,thirdcolX,所以只有1行。 1:N关系是订单(父级)与订单项(子级)

Please click here to see desired outcome

非常感谢您对此提供的帮助。 FWIW,我正在使用SSIS将数据从SQL源移动到SQL目标。我尝试了PIVOT,但我们不希望将行数据作为列名。

2 个答案:

答案 0 :(得分:0)

您可以生成RowNumber,然后使用派生表来实现。

;WITH CTE_TableName AS
(
SELECT *,RowNumber() over(Partition by myOrderNum ORDER BY MyOrderNum) AS rnk
FROM TableName
)
SELECT myOrderNum,firstcol1A
,(SELECT firstCol1A FROM CTE_TableName WHERE rnk =2 AND OrderNum = c.OrderNum) AS firstCol1B
,(SELECT firstCol1A FROM CTE_TableName WHERE rnk =3 AND OrderNum = c.OrderNum) AS firstCol1C
,SecondCol2A
,(SELECT SecondCol2A FROM CTE_TableName WHERE rnk =2 AND OrderNum = c.OrderNum) AS ,SecondCol2B
,(SELECT SecondCol2A FROM CTE_TableName WHERE rnk =3 AND OrderNum = c.OrderNum) AS ,SecondCol2C
,thirdCol3A
,(SELECT thirdCol3A FROM CTE_TableName WHERE rnk =2 AND OrderNum = c.OrderNum) AS thirdCol3B
,(SELECT thirdCol3A FROM CTE_TableName WHERE rnk =3 AND OrderNum = c.OrderNum) AS thirdCol3C
FROM CTE_TableName AS c;

答案 1 :(得分:0)

我会像Venkataram那样做,但是要在联接中而不是相关子查询中进行工作:

;WITH cte AS
(
SELECT *,RowNumber() over(Partition by myOrderNum ORDER BY MyOrderNum) AS rnk
FROM TableName
)
Select cte1.myOrderNum 
   ,cte1.FirstCol1A 
   ,cte2.FirstCol1A as FirstCol1B
   ,cte3.FirstCol1A as FirstCol1C
...
from cte cte1
    join cte cte2 on cte2.myOrderNum = cte1.myOrderNum and cte2.rnk=2
    join cte cte3 on cte3.myOrderNum = cte1.myOrderNum and cte3.rnk=3
where cte1.rnk=1

编辑:将ordernum更改为MyOrderNUm

相关问题