2016-07-27 7 views
1

Dies ist das erste Mal, dass ich eine Frage zu T-SQL stelle und ich bin ein Anfänger damit. Ich habe eine SQL-Abfrage, die aus zwei CTEs besteht, die auf weniger als 10 Zeilen gefiltert sind. Ich verwende eine SUM-Anweisung eine laufende Summe zu erhalten:ID-Spalte zu einem Abfrageergebnis hinzufügen

Sum(Diff) OVER(ORDER BY DateAdded) AS Summary 

DateAdded hat den gleichen Wert für mehrere Zeilen. Daher gibt es mir keine laufende Summe für jede Zeile. Ich muss ein Feld erstellen, das einfach die Anzahl der Zeilen zählt (ähnlich einer PK in einer DB-Tabelle), so dass ich es für meine ORDER BY Klausel verwenden kann. Wenn mein Verständnis stimmt, muss ich das tun, damit es funktioniert. Wie kann ich der Abfrageergebnismenge eine Aufzählungsspalte hinzufügen? Bitte beachten Sie, ich möchte nicht ALTER eine Tabelle, nur eine Spalte zum Abfrageergebnis hinzufügen. Ich hoffe, dass das, was ich geschrieben habe, klar ist. Vielen Dank!

+0

Anzahl und Summe sind zwei sehr unterschiedliche Dinge – Adam

+1

"ein Feld, das einfach die Anzahl der Zeilen zählt (ähnlich einer PK in einer DB-Tabelle)" - hmm, das ist nicht die Definition eines Schlüssels. – onedaywhen

+0

Ich verstehe. Ich habe nicht versucht, eine PK zu definieren. Ich habe es nur benutzt, um zu zeigen, wie die Ausgabe aussehen soll. Es tut uns leid! – Brian

Antwort

0

Anstelle der Verwendung von count() oder sum() Sie row_number() verwenden können, die eine bestimmte Zeilennummer geben, bei 1, in für jede Zeile beginnen Ihre Ergebnismenge:

SELECT ROW_NUMBER() OVER (ORDER BY dateAdded) as Summary 
+0

Wenn er versucht, eine laufende Summe zu erhalten, die verschachtelte CTEs erfordern würde, so dass er zuerst die 'ROW_NUMBER' und dann die 'ORDER BY' seines nächsten gefensterten Aggregats (in diesem Fall' SUM') verwenden kann. –

+0

OP sagt nicht, dass sie eine laufende Summe wollen, nur dass sie ein "ein Feld wollen, das einfach die Anzahl der Zeilen zählt". OP benutzte 'SUM()', um das zu tun, aber ich gehe nicht davon aus, dass 'Sum()' buchstäblich das ist, was man wollte. – JNevill

+0

@TomH ist richtig zu verstehen, was ich will (vielleicht war ich nicht klar, ich entschuldige mich). 'ROW_NUMBER()' gab mir das, wonach ich suchte (eine zusätzliche aufgezählte Spalte), um es in meiner laufenden Summe zu verwenden, und ich werde das verwenden. – Brian

-1

Ich glaube, dass Sie nur NEWID() zu Ihrem ORDER BY hinzufügen:

SELECT SUM(diff) OVER (ORDER BY DateAdded, NEWID()) AS Summary 
+0

Das funktionierte, aber es änderte irgendwie die Reihenreihenfolge. – Brian

+0

@onedaywhen Er sagte eine Menge Dinge. Ich beantwortete das eigentliche Problem, nicht die spezifische Frage am Ende seines Beitrags. Das ist in meiner Erfahrung nützlicher als pedantisch zu sein. –

+0

@Brian Wenn Sie versuchen, eine bestimmte Zeilenreihenfolge zu erhalten, sollten Sie in Ihrer Abfrage ein 'ORDER BY' haben (nicht nur die 'OVER'-Klausel). Dies wird dies in keiner Weise beeinflussen. –

0

Versuchen Sie folgendes:

DECLARE @Result TABLE 
(
    DT DATETIME 
) 
INSERT INTO @Result SELECT '1 Jan 1900' 
INSERT INTO @Result SELECT '1 Jan 1900' 

SELECT ROW_NUMBER() OVER(ORDER BY DT DESC) AS "Row Number", DT 
FROM @Result 
Verwandte Themen