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