Sql server 在我的t-sql查询的一部分中,结果不符合顺序

Sql server 在我的t-sql查询的一部分中,结果不符合顺序,sql-server,tsql,sql-server-2008-r2,Sql Server,Tsql,Sql Server 2008 R2,我有一个包含两列的数据集,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 我要做的是按TransDate的顺序

我有一个包含两列的数据集,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
我要做的是按TransDate的顺序将TransDateString放入变量中:

 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]]

的信息,至少通过您的输入数据,下面的代码可以为您提供:

[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,'')

至少在输入数据的情况下,以下代码为您提供:

[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,'')

SQL Server 2016提供了与其他聚合函数一样可以使用的函数:

SELECT STRING_AGG(TransDateString,',')
FROM #dataSet c
ORDER BY TransDate

不再支持SQL Server 2008 R2。值得注意的是,它提供了曾经是企业SKU的一部分的功能,甚至包括Express和LocalDB:压缩、分区、内存表、快照、掩蔽、审核等


性能和许可优势使升级成为一个非常有趣的想法

SQL Server 2016提供了与其他聚合函数一样可以使用的函数:

SELECT STRING_AGG(TransDateString,',')
FROM #dataSet c
ORDER BY TransDate

不再支持SQL Server 2008 R2。值得注意的是,它提供了曾经是企业SKU的一部分的功能,甚至包括Express和LocalDB:压缩、分区、内存表、快照、掩蔽、审核等


性能和许可优势使升级成为一个非常有趣的想法

SQLServer2106有一个方法。您使用的是哪个SQL Server版本?不再支持SQL Server 2008 R2。是时候升级了。顺便说一句,将内存表、压缩、列存储索引、分区甚至引入到Express Edition中,LocalDbSQL服务器2106有一个方法。您使用的是哪个SQL Server版本?不再支持SQL Server 2008 R2。是时候升级了。顺便说一句,它为Express Edition和LocalDb带来了内存表、压缩、列存储索引和分区