2016-11-30 26 views
1

Ich habe ein Dataset mit zwei Spalten, TransDateString und TransDate. TransdateString ist einfach eine nvarchar Version von Transdate, so dass die Daten wie folgt aussieht:Ergebnisse außerhalb der Reihenfolge in Teil meiner t-SQL-Abfrage

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 

Was ich versuche, die TransDateString in eine Variable, um von TransDate zu tun ist, zu erhalten:

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

Diese funktioniert, aber sie sind nicht in Ordnung. Zur Laufzeit ich so etwas wie @cols=[[1-2011],[10-2010],[6-2004],[7-2012]]

+1

Der SQL Server 2106 verfügt über eine Methode [STRING_AGG] (https://msdn.microsoft.com/en-us/library/mt790580.aspx). Welche SQL Server-Version verwenden Sie? –

+2

SQL Server 2008 R2 wird nicht mehr unterstützt. Zeit für ein Upgrade BTW [2016 SP1] (https://sqlperformance.com/2016/11/sql-server-2016/big-deal-sp1) bringt In-Memory-Tabellen, Komprimierung, Columnstore-Indizes, Partitionen, sogar zur Express Edition und LocalDb –

Antwort

3

Mindestens mit Eingabedaten erhalten, unter dem Code gibt Ihnen:

[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 bringt die STRING_AGG Funktion, die verwendet werden kann, wie andere Aggregatfunktionen:

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

SQL Server 2008 R2 wird nicht mehr unterstützt. Es ist erwähnenswert, dass SQL Server 2016 SP1 Funktionen bietet, die Teil des Enterprise SKUs, auch Express und LocalDB werden verwendet, um: Kompression, Partitionierung, In-Memory-Tabellen, Snapshots, Maskierung, Revision usw.

Die Leistung und Lizenzierung Vorteile make upgrade eine sehr interessante Idee.

Verwandte Themen