我是新来的,所以如果已经提出这类问题,请耐心等待,我会尽量保持清醒。话虽如此,我最终试图将下面的数据表转换为所需的格式。所有想法都很有帮助。
; 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中没有电话号码,则会将这些列留空。我需要查询将序列中的序列完全取出而不重复下一列中的电话号码。请帮忙。
谢谢, 米奇
答案 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
这将输出以下两个表: