转换 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:
我是新来的,所以如果有人问过这类问题,请多多包涵,我会尽量说清楚。话虽如此,我正竭尽全力尝试将下面的数据 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: