Bau*_*sie 5 sql sql-server sql-server-2012
我正在尝试使用SQL 2012基于以下数据生成特定字符串
| Id | Activity | Year |
|----|----------|------|
| 01 | AAAAA | 2008 |
| 01 | AAAAA | 2009 |
| 01 | AAAAA | 2010 |
| 01 | AAAAA | 2012 |
| 01 | AAAAA | 2013 |
| 01 | AAAAA | 2015 |
| 01 | BBBBB | 2014 |
| 01 | BBBBB | 2015 |
Run Code Online (Sandbox Code Playgroud)
结果需要看起来像;
| 01 | AAAAA | 2008-2010, 2012-2013, 2015 |
| 01 | BBBBB | 2014-2015 |
Run Code Online (Sandbox Code Playgroud)
任何关于如何实现这一点的想法将不胜感激.
用于ROW_NUMBER对连续年份和FOR XML PATH('')字符串连接进行分组.
WITH Cte AS(
SELECT *,
grp = year - ROW_NUMBER() OVER(PARTITION BY id, activity ORDER BY year)
FROM tbl
)
SELECT
id,
activity,
x.years
FROM Cte c
CROSS APPLY(
SELECT STUFF((
SELECT ', ' + CONVERT(VARCHAR(4), MIN(year)) +
CASE
WHEN MIN(year) <> MAX(year) THEN '-' + CONVERT(VARCHAR(4), MAX(year))
ELSE ''
END
FROM Cte
WHERE
id = c.id
ANd activity = c.activity
GROUP BY id, activity, grp
FOR XML PATH('')
), 1, 2, '')
)x(years)
GROUP BY id, activity, x.years
Run Code Online (Sandbox Code Playgroud)
结果:
| id | activity | years |
|----|----------|----------------------------|
| 01 | AAAAA | 2008-2010, 2012-2013, 2015 |
| 01 | BBBBB | 2014-2015 |
Run Code Online (Sandbox Code Playgroud)