SQL SERVER 多行轉爲一列

1、多行轉成一列(並以「,」分隔node

表名: 費目主表(T_MAIN) ,表數據以下函數

二、費項明細表( T_DETAIL )數據以下:3d

上述兩表經過 FEEGROUPID關聯。xml

想要的效果以下:blog

 

 查詢SQL以下:im

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 解釋:查詢

一、 STUFF()函數是爲去除結果列 (ITEMCODE)的首字母「,」db

二、FOR XML PATH(''):是爲了將ITEMCODE的行轉爲  XML文本列, img

 

內是爲了避免生成XML文本的首節點標籤, SELECT ',' 是爲了避免生成XML文本的子節點標籤

 

2、一列轉多行

源表( 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

 

3、將數據按某列分組後,取此組前幾行數據

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

相關文章
相關標籤/搜索