SQL SERVER 多行转为一列

一、多行转成一列(并以“,”分隔

表名: 费目主表(T_MAIN) ,表数据如下

2、费项明细表( T_DETAIL )数据如下:

上述两表通过 FEEGROUPID关联。

想要的效果如下:

 

 查询SQL如下:

SELECT FEEGROUPID, GROUPCODE , GROUPNAME,
ITEMCODE =(STUFF((
SELECT ',' + ITEMCODE FROM T_DETAIL G1 WHERE G1.FEEGROUPID = T.FEEGROUPID FOR XML PATH('') )
, 1,1,''))
FROM T_MAIN

SQL 解释:

1、 STUFF()函数是为去除结果列 (ITEMCODE)的首字母“,”

2、FOR XML PATH(''):是为了将ITEMCODE的行转为  XML文本列, 

 

内是为了不生成XML文本的首节点标签, SELECT ',' 是为了不生成XML文本的子节点标签

 

二、一列转多行

源表( T_TEST)数据如下:

想要的结果如下:

查询SQL:

SELECT a.FeeGroupId, GroupCode, b.[value]
FROM (SELECT FeeGroupId, GroupCode, [value]=CAST('<v>'+REPLACE(ItemCode,',','</v><v>')+'</v>' AS xml) FROM T_TEST) a
OUTER APPLY (SELECT [value]=T.C.value('.','varchar(50)') FROM a.[value].nodes('/v') AS T(C)) b

 

三、将数据按某列分组后,取此组前几行数据

SELECT T.FEEGROUPID, ITEMCODE, ITEMNAME FROM
(SELECT FLM_FEEITEMLIST.*,ROW_NUMBER() OVER(PARTITION BY FEEGROUPID ORDER BY FEEGROUPID DESC) RN FROM FLM_FEEITEMLIST WHERE ITEMCODE LIKE '10%') T
WHERE RN<=4

 

posted @ 2019-05-05 16:01  千年海岩  阅读(1598)  评论(0编辑  收藏  举报