2016-02-25 46 views
1

我是新来的,所以如果这种类型的问题已经被问到,请耐心等待,我会尝试尽可能清楚。就这样说,我正试图将下面的数据表转换为所需的格式。所有想法都有帮助。在SQL Server中转换数据

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 

我试图将数据转换成此表。

**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' 

但是如果没有在手机phtype会留下那些列空的序列0或1的电话号码。我需要查询将序列从等式中排除,而不必在下一列中重复电话号码。请帮忙。

感谢, 米奇

回答

0

所以,据我所知,你只是想在你的桌子下崩溃的数据单行,是否正确?我写了一个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 

此输出以下两个表:

Output Tables

+0

谢谢托马斯,ROW_NUMBER函数的工作完美。再次感谢你的帮助! – Mitchel

+0

非常欢迎。 –