SQL Server 如何部分转置表格

k97glaaz  于 2023-02-11  发布在  其他
关注(0)|答案(3)|浏览(117)

我必须从一个结构如下的表中创建一个包含联系人列表(ClientCode、Telephone、Name)的表:
| 客户代码|电话1|姓名1|电话2|姓名2|电话3|姓名3|
| - ------|- ------|- ------|- ------|- ------|- ------|- ------|
| 1234|小行星55555|约翰·M.|小行星79879|法兰克|小行星897987|保罗|
| 小行星9884|小行星84416|理查德德|小行星88416|海伦|小行星11594|卡特林|
我需要按ClientCode对在同一客户端工作的相同人员进行分组。
预期表:
| 客户代码|电话|姓名|
| - ------|- ------|- ------|
| 1234|小行星55555|约翰·M.|
| 1234|小行星79879|法兰克|
| 1234|小行星897987|保罗|
| 小行星9884|小行星84416|理查德德|
| 小行星9884|小行星88416|海伦|
| 小行星9884|小行星1159|卡特林|
我尝试了以下解决方案(来自this答案),但输出不正确

SELECT UNPVTBL.CLIENTCODE, UNPVTBL.NAME
FROM (SELECT * FROM -ORIGIN_TABLE-) P
UNPIVOT
(NAME FOR CONTACTS IN
    (NAME1, NAME2, NAME3)
)UNPVTBL

UNION
SELECT UNPVTBL.CLIENTCODE, UNPVTBL.TELEPHONE
FROM (SELECT * FROM -ORIGIN_TABLE-) G
UNPIVOT
(TELEPHONE FOR TELEPH IN
(TELEPHONE1, TELEPHONE2, TELEPHONE3) 
)UNPVTBL
js4nwp54

js4nwp541#

您可以尝试使用UNION ALL运算符执行此操作:

SELECT ClientCode, Telephone1 AS Telephone, Name1 AS Name FROM tab
UNION ALL
SELECT ClientCode, Telephone2 AS Telephone, Name2 AS Name FROM tab
UNION ALL
SELECT ClientCode, Telephone3 AS Telephone, Name3 AS Name FROM tab

输出:
| 客户代码|电话|姓名|
| - ------|- ------|- ------|
| 1234|小行星55555|约翰·M.|
| 小行星9884|小行星84416|理查德德|
| 1234|小行星79879|法兰克|
| 小行星9884|小行星88416|海伦|
| 1234|小行星897987|保罗|
| 小行星9884|小行星11594|卡特林|
检查here演示。

l7wslrjt

l7wslrjt2#

一种方法是将值反透视:

select t.ClientCode,x.name, x.Telephone
from (
    VALUES  (1234, 55555, N'John M.', 79879, N'Frank', 897987, N'Paul')
    ,   (9884, 84416, N'Richard', 88416, N'Helen', 11594, N'Katrin')
) t (ClientCode,Telephone1,Name1,Telephone2,Name2,Telephone3,Name3)
cross apply (
    VALUES  (Telephone1, Name1)
    ,   (Telephone2, Name2)
    ,   (Telephone3, Name3)
    ) x (Telephone, Name)
owfi6suc

owfi6suc3#

  • 希望 * 这个练习是为了修正你的设计;如果不是,也应该是。

至于解决方案,VALUES表构造似乎可以很简单地完成此操作:

SELECT YT.ClientCode,
       V.Telephone,
       V.[Name]
FROM dbo.YourTable YT
     CROSS APPLY(VALUES(Telephone1,Name1),
                       (Telephone2,Name2),
                       (Telephone3,Name3))V(Telephone,Name);

相关问题