当前位置: 代码迷 >> Sql Server >> 怎么把一个表某列的值按顺序转换成字符串
  详细解决方案

怎么把一个表某列的值按顺序转换成字符串

热度:52   发布时间:2016-04-24 09:26:15.0
如何把一个表某列的值按顺序转换成字符串?
本帖最后由 hustsay23 于 2015-01-23 16:33:57 编辑
一个表tData 有一个ID字段记录顺序,有一个字段cType 记录值
记录从行数上显示是:
ID cType
-------------
1 A
2 A
3 B
4 B
5 B
6 C
7 A
8 B
9 B
10 A 

我想知道有没有SQL可以直接抽取出
A
B
C
A
B
A

也就是去掉其中重复的行,或者转换成字符串:“A,B,C,A,B,A”这种也行?

------解决思路----------------------
/* 测试数据
WITH tdata(ID,cType) AS (
    SELECT 1,'A' UNION ALL
    SELECT 2,'A' UNION ALL
    SELECT 3,'B' UNION ALL
    SELECT 4,'B' UNION ALL
    SELECT 5,'B' UNION ALL
    SELECT 6,'C' UNION ALL
    SELECT 7,'A' UNION ALL
    SELECT 8,'B' UNION ALL
    SELECT 9,'B' UNION ALL
    SELECT 10,'A' 
) */
    SELECT t1.cType
      FROM tdata t1
 LEFT JOIN tdata t0
        ON t0.ID+1 = t1.ID
     WHERE ISNULL(t0.cType,'') <> t1.cType

cType
-----
A
B
C
A
B
A

------解决思路----------------------
第一种
;WITH CTE AS
(
SELECT 1 AS [ID], 'A' AS [Name]
UNION ALL SELECT 2, 'A'
UNION ALL SELECT 3, 'B'
UNION ALL SELECT 4, 'B'
UNION ALL SELECT 5, 'B'
UNION ALL SELECT 6, 'C'
UNION ALL SELECT 7, 'A'
UNION ALL SELECT 8, 'B'
UNION ALL SELECT 9, 'B'
UNION ALL SELECT 10, 'A'
)
SELECT NAME
FROM CTE a
WHERE NOT EXISTS(SELECT * FROM CTE WHERE ID=a.ID+1 AND Name = a.Name)


如果要第二种效果也只需要用个 For Xml Path('') 就可以了
------解决思路----------------------
;WITH CTE AS(
SELECT ROW_NUMBER()OVER(ORDER BY ID)RN
,ROW_NUMBER()OVER(PARTITION BY cType ORDER BY ID)RN1
,*
FROM tData
)
SELECT cType FROM CTE
GROUP BY RN-RN1,cType
ORDER BY MIN(RN)
SQL2005+有效
  相关解决方案