Ich wurde beauftragt, eine Ansicht für einen Kunden zu erstellen. Insbesondere muss es in einer Ansicht sein . Es gibt jedoch einige Berechnungen, bei denen ich nicht sicher bin, wie ich sie in einer Ansicht ausführen soll. Ich weiß nicht, ob es überhaupt möglich ist. Aber andererseits ist mein Verstand schwach.
Ich verwende SQL Server 2008R2, daher OVER()
funktionieren erweiterte Funktionen nicht.
Nehmen wir an, eine Person erhält 400 Dollar zum Ausgeben. Sie können mehr ausgeben, aber die ersten 400 Dollar sind kostenlos. Eine Spalte des Berichts enthält den Betrag, den die Person für etwas ausgegeben hat, und eine andere Spalte enthält den Gesamtbetrag, den die Person aus eigener Tasche bezahlen muss.
Für den ersten Datensatz im Bericht für diese Person hat eine Spalte einen Betrag, den sie ausgegeben hat, z. B. 50 US-Dollar, und eine zweite Spalte hat einen Betrag von 0 US-Dollar. Hinter den Kulissen müssen sie noch 350 Dollar ausgeben.
Der nächste Rekord hat die Person, die 300 Dollar ausgibt. In der zweiten Spalte wird weiterhin 0 US-Dollar angezeigt, und hinter den Kulissen sind die anfänglichen 400 US-Dollar jetzt 50 US-Dollar.
Der dritte Rekord für die Person zeigt, dass sie 75 Dollar ausgegeben hat, aber nur noch 50 Dollar von den anfänglichen 400 Dollar übrig sind. Die zweite Spalte sollte jetzt einen Wert von 25 USD enthalten. Sie haben die anfänglichen 400 Dollar aufgebraucht und geben jetzt ihr eigenes Geld aus.
Der vierte Datensatz zeigt, dass sie 40 US-Dollar ausgegeben haben. In der zweiten Spalte werden nun 65 US-Dollar angezeigt. usw...
Ich habe kurz über CTEs und Tabellenwertfunktionen und dergleichen gelesen, aber ist es möglich, sie in einer beliebigen Kombination zu verwenden, um das gewünschte Verhalten oben zu erzielen?
Unten finden Sie einen Beispielcode für die Struktur und die gewünschten Ergebnisse
CREATE TABLE Payroll (
PersonID int,
PlanCode varchar(10),
Deduction int NULL
)
GO
INSERT INTO Payroll (PersonID, PlanCode, Deduction)
VALUES (1, 'Medical', 200)
,(1, 'Dental', 250)
,(1, 'Vision', 300)
,(2, 'Medical', 100)
,(2, 'Dental', 150)
,(2, 'Vision', 100)
,(2, 'Disability', 100)
,(2, 'Life', 140)
Gewünschten Erfolge:
Es kann sinnvoll sein, sich das OutOfPocket
als vorzustellen TotalOutOfPocket
.
Es gibt nichts Besseres als einen Zeitstempel in den Quelldaten für die Reihenfolge der Einträge. Die Reihenfolge ist nicht zu wichtig. Wenn eine Bestellung erfolgt, erfolgt diese auf der PlanCode
.
Aufgrund unserer Einschränkungen und einer dritten Spalte, die nicht enthalten sein musste, sind keine doppelten Einträge möglich.
quelle
(PersonID, PlanCode) INCLUDE (Deduction)
würde den Abfragen helfen (je nachdem, was Sie verwenden möchten).Antworten:
Dies wird in PlanCode sortiert. Wenn Sie Duplikate haben, verwenden Sie eine row_number ().
Wenn Sie eine bestimmte Reihenfolge benötigen, muss diese Reihenfolge in der Tabelle enthalten sein
oder
quelle
Etwas in diese Richtung vielleicht? Mit der
OVER
Klausel für können Sie Summen ausführenSUM
.quelle
CREATE VIEW [ViewName] AS
vor derWITH running_total
Zeile hinzu. Sie müssen auch dieORDER BY
am Ende entfernen ; ANSICHTEN werdenORDER BY
in der Definition nicht unterstützt . Sie können dieselbe Anweisung anwenden, wenn Sie die ANSICHT abfragen.Das folgende Skript wird streng auf Ihren Beispieldaten basieren (und seine Tabellenstruktur) und ist für SQL Server 2008 runnable.
Diese Frage kann einfacher zu behandeln sein, wenn die Tabelle [PayRoll] einen Primärschlüssel hat. Ich habe den ganzen Code hier eingefügt:
Das Ergebnis ist:
quelle