2016-11-30 1 views
1

У меня есть набор данных с двумя столбцами, TransDateString и TransDate. TransdateString это просто версия NVARCHAR из Transdate, поэтому данные выглядит следующим образом:Результаты не в порядке моего запроса t-sql

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

+1

SQL Server 2106 имеет метод [STRING_AGG] (https://msdn.microsoft.com/en-us/library/mt790580.aspx). Какую версию SQL Server вы используете? –

+2

SQL Server 2008 R2 больше не поддерживается. Время обновления. BTW [2016 SP1] (https://sqlperformance.com/2016/11/sql-server-2016/big-deal-sp1) содержит таблицы памяти, сжатия, индексы столбцов, разделы даже в Express Edition и LocalDb –

ответ

3

По крайней мере, с входными данными, приведенный ниже код дает:

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

SQL Server 2016 дает функцию STRING_AGG, которую можно использовать так же, как другие совокупные функции:

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

SQL Server 2008 R2 больше не поддерживается. Стоит отметить, что SQL Server 2016 SP1 предлагает функции, которые раньше были частью Enterprise артикулов, даже Экспресс и LocalDB: сжатие, разбиение на разделы, в памяти таблицы, моментальные снимки, маскировка, аудит и т.д.

ПРЕДСТАВЛЕНИЕМ и лицензионных льгот сделать модернизацию очень интересной идеи.

 Смежные вопросы

  • Нет связанных вопросов^_^