SQL Server - 将多个列转换为多行

时间:2017-09-23 18:15:00

标签: sql sql-server

我有一个宽表,包含60多列UPS / Fedex跟踪号码。我正在尝试减少列数并建立父对子关系。

SELECT 
    [TRACKING-NO1], [TRACKING-NO2], [TRACKING-NO3], [TRACKING-NO4],
    [TRACKING-NO5], [TRACKING-NO6], [TRACKING-NO7], [TRACKING-NO8],
    [TRACKING-NO9], [TRACKING-NO10]
FROM 
    [CustomerServiceOrderEntry].[dbo].[InvoicedOrdersTempTable]
WHERE
    [TRACKING-NO2] IS NOT NULL

输出返回一行(60+)列中所有跟踪号的列表。如果有子追踪号码,则将填充第2-60列;如果没有子跟踪号码,则2-60将为NULL。

我想要做的是拥有一个父母跟踪号码和相关的子追踪号码,以及一个标志,表明它是一个孩子。

Current Structure

New Output

非常感谢您提供的任何帮助......

2 个答案:

答案 0 :(得分:1)

我们需要使用UNPIVOT将列转换为行。

但是UNPIVOT不会返回任何没有子列的行。

这'为什么,我们需要另外确定这种行。

SELECT 
    [TRACKING-NO1] TrackingNumberParent ,
    'TRUE' TrackingNumberChildren
    ,TrackingNumberChild 
FROM 
    (SELECT * FROM [CustomerServiceOrderEntry].[dbo].[InvoicedOrdersTempTable] ) SRC 
        UNPIVOT( TrackingNumberChild FOR COL IN (
            [TRACKING-NO2],
            [TRACKING-NO3],
            [TRACKING-NO4],
            [TRACKING-NO5],
            [TRACKING-NO6],
            [TRACKING-NO7],
            [TRACKING-NO8],
            [TRACKING-NO9],
            [TRACKING-NO10])) PVT
UNION ALL
SELECT 
    [TRACKING-NO1] TrackingNumberParent, 
    'FALSE' TrackingNumberChildren, 
    NULL TrackingNumberChild 
FROM 
    [CustomerServiceOrderEntry].[dbo].[InvoicedOrdersTempTable] 
WHERE 
    [TRACKING-NO2] IS NULL
ORDER BY 
    TrackingNumberParent

答案 1 :(得分:0)

以下内容应该快得多,因为它只需要一次通过基表...

var detailViewController: UIViewController & DetailViewController