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

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

SQL SERVER 多行转为一列 随笔 第1张

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

SQL SERVER 多行转为一列 随笔 第2张

上述两表通过 FEEGROUPID关联。

想要的效果如下:

SQL SERVER 多行转为一列 随笔 第3张

 

 查询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文本列, SQL SERVER 多行转为一列 随笔 第4张

 

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

 

二、一列转多行

源表( T_TEST)数据如下:

SQL SERVER 多行转为一列 随笔 第5张

想要的结果如下:

SQL SERVER 多行转为一列 随笔 第6张

查询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

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄