转换SQL Server中的数据

时间:2016-02-25 16:38:07

标签: sql-server transform rows

我是新来的,所以如果已经提出这类问题,请耐心等待,我会尽量保持清醒。话虽如此,我最终试图将下面的数据表转换为所需的格式。所有想法都很有帮助。

; in user ns
user=> (defmacro do-verb [n r] 
         (list (symbol (str "user." (name r) "/" (name n)))))

; quick test
user=> (macroexpand '(do-verb :x :b))
; (user.b/x)

; create a fn in user.b
user.b=> (defn x [] "yay")

; execute new macro
user=> (do-verb :x :b) ; calls (user.b/x)
"yay"

我正在尝试将数据转换为此表。

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

但是,如果手机phtype的序列0或1中没有电话号码,则会将这些列留空。我需要查询将序列中的序列完全取出而不重复下一列中的电话号码。请帮忙。

谢谢, 米奇

1 个答案:

答案 0 :(得分: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