转换 SQL 服务器中的数据

Transforming Data in SQL Server

我是新来的,所以如果有人问过这类问题,请多多包涵,我会尽量说清楚。话虽如此,我正竭尽全力尝试将下面的数据 table 转换为所需的格式。所有的想法都是有帮助的。

PhType        PhNumber       Sequence
-------------------------------------
Cell Phone    111-222-3333      2
Cell Phone    222-333-4444      5
Home Phone    999-222-1111      6
Home Phone    555-444-3333      8

我正在尝试将数据转换成这个 table。

**CellPhone1#**  **Sequence**  **CellPhone2#**  **Sequence**  **HomePhone1#** **Sequence**  **HomePhone2#**  **Sequence**                                                                              
111-222-3333  ----  2  ------        222-333-4444 -----     5    ---------      999-222-1111 ----- 6     -------     555-444-3333   ----------      8

我的想法是将数据行转换为列,但由于数字上的序列不是按顺序排列的,所以我很难在没有数据间隙的情况下做到这一点。目前我正在将信息转换为连接级别的列

LEFT OUTER JOIN
    Reports.dbo.BorrowerTelephones BT with(nolock) ON B1.HHNbr = BT.HHNbr
                                                   AND B1.NamSeq = BT.NamSeq
                                                   AND BT.Seq = 0
                                                   AND BT.PhType = 'Cell Phone'
LEFT OUTER JOIN 
    Reports.dbo.BorrowerTelephones BT1 with(nolock) ON B1.HHNbr = BT1.HHNbr
                                                    AND B1.NamSeq = BT1.NamSeq
                                                    AND BT1.Seq = 1
                                                    AND BT1.PhType = 'Cell Phone'

但是,如果单元格 phone phtype 的序列 0 或 1 中没有 phone 数字,则这些列将留空。我需要查询将序列完全从等式中取出,而无需在下一列中重复 phone 数字。请帮忙。

谢谢, 米奇

因此,据我了解,您只是想将 table 中的数据折叠成一行,对吗?我写了一个 SQL 查询来测试我认为你想要使用 ROW_NUMBER() 来处理序列号中的空白。我希望这能让您了解您需要什么。

CREATE TABLE #testPhones (
    PhType VARCHAR(20),
    PhNumber VARCHAR(12),
    PhSequence INT)

INSERT INTO #testPhones(PhType, PhNumber, PhSequence)
VALUES('Cell Phone', '111-222-3333', 3),
      ('Cell Phone', '222-333-4444', 5),
      ('Home Phone', '999-222-1111', 6),
      ('Home Phone', '555-444-3333', 8)

SELECT ROW_NUMBER() OVER(ORDER BY PhSequence) AS Row, *
FROM #testPhones

SELECT A.PhNumber AS CellPhone1#, A.PhSequence AS PhSequence, 
    B.PhNumber AS CellPhone2#, B.PhSequence AS PhSequence, 
    C.PhNumber AS HomePhone1#, C.PhSequence AS PhSequence, 
    D.PhNumber AS HomePhone2#, D.PhSequence AS PhSequence
FROM (SELECT PhNumber, PhSequence FROM (SELECT ROW_NUMBER() OVER(ORDER BY PhSequence) AS RowNo, * FROM #testPhones) AS A WHERE RowNo = 1) AS A
    LEFT OUTER JOIN (SELECT PhNumber, PhSequence FROM (SELECT ROW_NUMBER() OVER(ORDER BY PhSequence) AS RowNo, * FROM #testPhones) AS B WHERE RowNo = 2) AS B ON 1=1
    LEFT OUTER JOIN (SELECT PhNumber, PhSequence FROM (SELECT ROW_NUMBER() OVER(ORDER BY PhSequence) AS RowNo, * FROM #testPhones) AS C WHERE RowNo = 3) AS C ON 1=1
    LEFT OUTER JOIN (SELECT PhNumber, PhSequence FROM (SELECT ROW_NUMBER() OVER(ORDER BY PhSequence) AS RowNo, * FROM #testPhones) AS D WHERE RowNo = 4) AS D ON 1=1

DROP TABLE #testPhones

这会输出以下两个 tables:

Output Tables