Das Folgende war ein Muster, das ich vor zwei Jahren benutzt habe und es wird immer wieder in meinem alten Code wiederholt.
Es gruppiert effektiv die gleichen Daten unter Verwendung verschiedener Zeiträume.
Gibt es eine Standardmethode, mit der ich mich diesem Thema nähern sollte oder ist diese langatmige Methode so gut, wie ich es bekommen werde?
Eine andere Möglichkeit, diese Frage zu stellen, ist, wie das Folgende präziser gemacht werden kann.
Alle 4 Abfragen kommen aus derselben Datenquelle und alle vier gehen in dieselbe Ausgabetabelle, können diese 4 Abfragen zu einem kürzeren Skript zusammengefasst werden?
Verwenden Sie Parameter - VALUES als Tabellenquelle und wenden Sie sie als Parameter in CROSS APPLY mit abgeleiteter Tabelle an
%Vor%Demo auf SQLFiddle
Ich würde es zu einer einzigen Insert-Anweisung machen.
Wäre es jetzt vorzuziehen, die Gruppe nicht durch Gruppieren von Sätzen, Cubes oder Rollups zu verwenden, da ich nicht sehe, wie ich die über einzelne Tagesgruppen berechneten Zeilen davon abhalten könnte, weniger als die über größere Zeitraumgruppen berechneten Zeilen zu sein.
Damit dies nicht geschieht, könnten Sie einen common-table-Ausdruck (; WITH mycte AS (... Unterabfrage ...)), eine temporäre Tabelle, eine Tabellenvariable oder ein XML-formatiertes Textobjekt erstellen, das das Zeiträume, jeweils eine Zeile / Element.
Dieses Skript kann auch mit mehr oder weniger definierten Zeiträumen ausgeführt werden, um alle Ergebnisse mit nur einer Reise von der App zum Server zu erhalten.
Hier ist ein Beispiel mit einer temporären Tabelle, die auch leicht zu einer Tabellenvariablen gemacht werden kann:
%Vor%Und hier ist die Hauptabfrage ...
%Vor%Sie können auch die Tabelle #TempTimePeriods mithilfe eines Common-Table-Expressions unten eliminieren:
%Vor%Und schließlich könnten Sie die Zeiträume in einer XML-Zeichenfolge definieren - praktisch für die Weitergabe an eine gespeicherte Prozedur, wenn Sie dies bevorzugen und wie folgt vorgehen:
%Vor%und die Hauptabfrage geändert, um das XML zu lesen:
%Vor%Für ein Beispiel, wie die XML-String-Abfrage in eine Prozedur umgewandelt werden könnte, um einen einzelnen Parameter von 1 oder mehreren Zeiträumen zu unterstützen:
%Vor%Was könnte ausgeführt werden als:
%Vor% Eine mögliche Verbesserung der Antwort von Fred. Nicht in Bezug auf Geschwindigkeit, nur Lesbarkeit / Modifizierbarkeit durch Entfernen der zusätzlichen CASE
. Als Vorschlag habe ich auch die Übergabe beider Strings (z. B. DAY
und DAY-1
) durch eine einzelne Zeichenfolge ersetzt, und die andere Zeichenfolge sollte nur eine Concat sein; dies würde jedoch dazu führen, dass PrevCalMonth
stattdessen als MTD-1
angezeigt wird (obwohl es einige Umgehungsmöglichkeiten dafür gibt).
Und verwende so:
%Vor%Es scheint, dass dies der Job für CUBE-Gruppierungen .
Entschuldigung, ich werde Ihnen keine genaue Lösung für Ihr Problem geben, aber die MOCKUP Form von select sollte wie folgt aussehen:
%Vor% Eins minus - das cube
erzeugt hier zu viele Daten für Ihr Problem. Also muss es herausgefiltert werden. Ein großes Plus wäre, dass Sie nur eine Auswahl in temporäre Tabelle brauchen.
Tags und Links sql sql-server design-patterns sql-server-2008-r2