我有一个有两个列的数据集,TransDateString和TransDate。TransdateString只是Transdate的nvarchar版本,因此数据如下所示:
TransDate | TransDateString
2011-1-4 | 1-2011
2004-6-5 | 6-2004
2010-10-14| 10-2010
2012-7-21 | 7-2012
2010-10-11| 10-2010
2012-7-5 | 7-2012我要做的是让TransDateString按照TransDate的顺序排列成一个变量:
SET @cols = STUFF((
SELECT ',' + QUOTENAME(A.TransDateString) FROM
(
Select c.TransDateString,
Row_Number() Over (Partition By c.TransDateString Order By c.TransDate asc) RowNum
FROM #dataSet c
) A
Where RowNum = 1
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')这是可行的,但它们是不合理的。在运行时,我得到类似于@cols=[[1-2011],[10-2010],[6-2004],[7-2012]]的东西
发布于 2016-11-30 14:44:30
至少在输入数据时,下面的代码为您提供了:
[6-2004],[10-2010],[1-2011],[7-2012]
DECLARE @DataSource TABLE
(
[TransDate] VARCHAR(12)
,[TransDateString] VARCHAR(12)
);
INSERT INTO @DataSource ([TransDate], [TransDateString])
VALUES ('2011-1-4', '1-2011')
,('2004-6-5', '6-2004')
,('2010-10-14', '10-2010')
,('2010-10-14', '10-2010')
,('2012-7-21', '7-2012')
,('2012-7-21', '7-2012');
SELECT
STUFF((
SELECT ',' + QUOTENAME(A.TransDateString) FROM
(
Select c.TransDateString
,Row_Number() Over (PARTITION BY C.TransDateString Order By c.TransDate asc) RowNum
,Row_Number() Over (Order By c.TransDate asc) RowId
FROM @DataSource c
) A
WHERE RowNUm = 1
ORDER BY RowId
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')发布于 2016-11-30 15:07:41
Server 2016带来了可以像其他聚合函数一样使用的阿格函数:
SELECT STRING_AGG(TransDateString,',')
FROM #dataSet c
ORDER BY TransDateServer 2008 R2不再受支持。值得注意的是,Server 2016 SP1提供了曾经是Enterprise的一部分的特性,甚至用于Express和LocalDB:压缩、分区、内存中的表、快照、掩蔽、审计等等。
性能和许可的好处使升级成为一个非常有趣的想法。
https://stackoverflow.com/questions/40891110
复制相似问题