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