【问题标题】:SQL Server Row to Cols [duplicate]SQL Server行到列[重复]
【发布时间】:2015-10-02 17:46:33
【问题描述】:

我似乎是一项简单的任务,但我需要 sql 专家的帮助。

联系人的数量可以从 1 到 30 人不等,我希望每个 cust_ref 将所有电话号码放在一行中。

我该怎么做??

【问题讨论】:

  • 您需要为此使用动态 SQL ;)。
  • @shA.t:我发布了一个没有动态 SQL 的解决方案...
  • @shA.t,这是真的 :) 如果您假设一个人有数百个电话号码。我会选择枢轴进入这么多,这肯定足够了。最大的优势:你可以把它放到一个 UDF 中并在任何地方绑定它。顺便说一句:“可以从 1 到 30 不等”似乎将此设置为最大范围...

标签: sql sql-server pivot


【解决方案1】:

这是一个没有动态sql的解决方案,请试一试:

declare @contacts table(cust_ref int,phone varchar(100));
insert into @contacts values(10000,'ph10000a'),(10000,'ph10000b'),(10000,'ph10000c')
                           ,(10001,'ph10001a'),(10001,'ph10001b'),(10001,'ph10001c') 
                           ,(10002,'ph10002a'),(10002,'ph10002b');

SELECT p.*
FROM
( 
    SELECT 'phone'+REPLACE(STR(ROW_NUMBER() OVER(PARTITION BY cust_ref ORDER BY phone),2),' ','0') AS inx,*
    FROM @contacts    
) AS tbl
PIVOT
(
    MIN(phone) FOR inx IN(phone01,phone02,phone03,phone04) --type more...
) AS p        

【讨论】:

  • 谢谢Shnugo,但我必须使用sql查询来完成。我不能使用函数。没有UDF有解决方案吗?
  • 对不起,不明白这个...贴出的解决方案是纯SQL,没有UDF。只需根据您的需求/表格名称调整它...如果有帮助,请勾选接受和/或投票...
  • 您在将@contact 改编为真实的数据库内容后,它的效果非常好!谢谢Shnugo!
  • 很高兴为您提供帮助,感谢您的声誉积分...
  • @Aren 您已经发布了 2 个表格并要求提供要求,但 shnugo 已在一张表格中完成所有操作,因此它将如何提供所需的输出
【解决方案2】:

通过使用 CROSS APPLY,CTE 和 UNION ALL 我们可以得到上述要求

declare @tableA table (RefId int,Phone varchar(10))
insert into @tableA (RefId,Phone)values (10000,'030123456'),(100123,060123445)

Declare @tableB table (CustID  INT,RefId INT,Phone varchar(10)))
insert into @tableB (CustID,RefId,Phone)values 
(1,10000,'030245789'),
(2,10000,'030245889'),
(1,100123,'060245789'),
(2,100123,'060243389'),
(3,100123,'060289389')

; with CTE AS (
select A.RefId,A.Phone As Phone from @tableA A 
UNION 
select B.RefId,B.Phone As Phone from @tableB B )

 select * from (
 Select RefId,
 val,
 COL + CAST(ROW_NUMBER()OVER(PARTITION BY RefId ORDER BY RefId) AS VARCHAR(1))RN  
    FROM CTE 
CROSS APPLY (VALUES ('Phone',Phone))CS(Col,val))T
PIVOT (MAX(VAL) FOR RN IN ([Phone1],[Phone2],[Phone3],[Phone4]))P 

【讨论】:

    猜你喜欢
    • 2012-10-03
    • 2012-12-18
    • 2016-01-05
    • 1970-01-01
    • 1970-01-01
    • 2015-07-01
    • 2013-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多