首页 新闻 会员 周边 捐助

Sql 行拆分,合并列问题

1
悬赏园豆:20 [已解决问题] 解决于 2012-04-26 10:32

             列1
行1          1
行2          2
行3          3
行4          4

利用SQL做成
             列1           列1
行1          1              3
行2          2              4

问题补充:

补充说明:相当于先分页,然后把,两页的内容合并成一页,合成的一页,行数不变,增加一列把合并的那页内容放在这列中以3行为固定行转换成

云中歌的主页 云中歌 | 初学一级 | 园豆:148
提问于:2012-04-24 22:17
< >
分享
最佳答案
0

    

转换成   .....

 

 

 

是这样么   

 


--使用FOR XML的方式实现
select name,(
SELECT ',' + title FROM TestTitle subTitle WHERE name = TestTitle.name
FOR XML PATH('') ) as p
from TestTitle GROUP BY name

SELECT name,STUFF(
(
SELECT',' + title FROM TestTitle subTitle WHERE name = TestTitle.name FOR XML PATH('')
),1, 1, '') AS allTitle
FROM TestTitle GROUP BY name

 


--STUFF函数:删除指定长度的字符,并在指定的起点处插入另一组字符。
--参数1:操作数据源,参数2:指定起始位子,参数3:删除长度,参数4:插入新的数据源
SELECT STUFF('abcdef', 2, 2, 'A')

 

第二种方法 

 

 


--第一步,设置好分组的编号
--PARTITION BY将结果集分为多个分区。
--开窗函数分别应用于每个分区,并为每个分区重新启动计算。

SELECT
ROW_NUMBER() OVER(PARTITION BY name ORDER BY title) AS ID,
name,title FROM TestTitle ORDER BY name,title
-- 第二步,根据有编号的子查询,进行分组处理
SELECT name,
CASE WHEN COUNT(name) = 1 THEN MAX(title)
WHEN COUNT(name) = 2 THEN
MAX( CASE WHEN SubQuery.no = 1 THEN title + ',' ELSE '' END )
+ MAX( CASE WHEN SubQuery.no = 2 THEN title ELSE '' END )
WHEN COUNT(name) = 3 THEN
MAX( CASE WHEN SubQuery.no = 1 THEN title + ',' ELSE '' END )
+ MAX( CASE WHEN SubQuery.no = 2 THEN title + ',' ELSE '' END )
+ MAX( CASE WHEN SubQuery.no = 3 THEN title ELSE '' END )
END AS new_title
FROM
(
SELECT
ROW_NUMBER() OVER(PARTITION BY name ORDER BY title ) AS no,
name,title
FROM TestTitle
) subQuery
GROUP BY name

收获园豆:10
┢┦偉 | 小虾三级 |园豆:1240 | 2012-04-25 10:23

如果不是你在给我说  

┢┦偉 | 园豆:1240 (小虾三级) | 2012-04-25 10:24

@┢┦偉: 不是这样,应该是这样

转换成这样

云中歌 | 园豆:148 (初学一级) | 2012-04-25 10:31

@云中歌: 有点没看懂   下面的fid 和上面的fid的值不一样

┢┦偉 | 园豆:1240 (小虾三级) | 2012-04-25 12:06

@┢┦偉: 电脑,网速卡的一笔,谢谢你解答,我已近解决了,截图的时候说明的不够详细,FID其实不用管的,是转换后表的主键,主要是FIDLeft和FIDRight记录的是要转换表的主键。后头,我整理一下,把我的答案公布一下

云中歌 | 园豆:148 (初学一级) | 2012-04-26 10:28

@云中歌: 恩,不用。好的,弄出来我也学学。

┢┦偉 | 园豆:1240 (小虾三级) | 2012-04-26 10:41
其他回答(3)
0

看不出来有什么规律

收获园豆:10
artwl | 园豆:16736 (专家六级) | 2012-04-24 22:19

嗯,我的错,相当于先分页,然后把,两页的内容合并成一页,合成的一页,行数不变,增加一列把合并的那页内容放在这列中

支持(0) 反对(0) 云中歌 | 园豆:148 (初学一级) | 2012-04-24 22:23
0

呵呵,期待学习,正在烦

KivenRo | 园豆:1734 (小虾三级) | 2012-04-25 12:54
0

问题我也没看懂, 需求不明确, 举的例子表述性不强, 云中歌的解答第一种方案可学, 第二种纯粹是拼接, 当“张三”身兼职位数>3时, 第二种方案不可取, 可以试试拼接字符串的方法:

--SQL查询中直接赋值

DECLARE @mytableTABLE ( Col1 VARCHAR(10) )

INSERT  INTO @mytable

VALUES  ( 'AA' ),

        ( 'BB' ),

        ( 'CC' )

SELECT  @Colstring = ISNULL(@Colstring + ',', '') +ISNULL(Col1, '')

FROM    @mytable

SELECT  @Colstring AS Colstring

 

--For XML

DECLARE @mytableTABLE ( Col1 VARCHAR(10) )

INSERT  INTO @mytable

VALUES  ( 'AA' ),

        ( 'BB' ),

        ( 'CC' )

SELECT  Col1+''

 FROM @mytable ORDER BY Col1 FOR XML PATH('T')

Chao Hong | 园豆:244 (菜鸟二级) | 2012-04-25 17:23
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册