Ich hatte zuvor eine Frage gestellt, die beantwortet wurde, für die ich aber eine Abfrage benötige Das auch. Ich habe eine Tabellenstruktur mit Daten wie dieser (Daten im Format TT / MM / JJJJ ).
%Vor%Im Grunde handelt es sich um eine Tabelle, in der die Patienten in eine bestimmte Station aufgenommen und zwischen den Stationen überwiesen und schließlich entweder am selben Tag oder wenige Tage später entlassen werden. Das erwartete Ergebnis der Abfrage wäre:
%Vor%Das Entlassungsdatumsfeld wird nur gefüllt, wenn der Patient entlassen wird, daher möchte ich den Datumsunterschied zwischen jedem Datum der Bewegung des Patienten einschließlich der Aufnahme und dem Entlassungsdatum berechnen.
Ich benutze MS Access 2003.
Ich hoffe, dass jemand mir dabei helfen kann.
Bei jeder komplexen Abfrage baut ein Teil der Kunst die Abfrage Stück für Stück auf und testet so, wie Sie es tun.
Ich gehe davon aus, dass der Tabellenname PatientMovements ist und dass:
Vorgegebene Paare von Zeilen wie ID = {6,7} und ID = {8,9}, es ist richtig zu sagen, dass die Zeile, wo der Patient (Kontonummer), Einheit und Zulassung Datum mit Null-Entlassungsdatum wird ignoriert, wenn es auch einen Datensatz für den gleichen Patienten, die gleiche Einheit und das gleiche Zulassungsdatum gibt, aber ein Entlassungsdatum ungleich null.
Schritt eins besteht darin, die Zeilen zu erzeugen, an denen wir arbeiten müssen, und die irrelevanten Daten aus der in der Datenbank aufgezeichneten Tabelle herauszufiltern. Dies ist eine UNION von zwei Datensätzen:
Der erste Teil der UNION ist eindeutig:
%Vor%Weniger offensichtlich ist der zweite Teil der UNION:
%Vor%Nun können Sie diese zu einer einzigen Ergebnismenge kombinieren:
%Vor%Sie können die obige Abfrage überprüfen, indem Sie überprüfen, ob Zeilen mit den IDs 1..5, 7 und 9 zurückgegeben werden.
Warnung: nicht getesteter Code. Keines der SQL in dieser Antwort war in der Nähe eines DBMS, daher wurde es nicht getestet.
Und dann können Sie Ihr Lernen von der anderen Frage anwenden, um die Daten zu bestellen und berechnen Sie die Datumsunterschiede, etc. Die einzige Komplikation ist, dass Sie diese Abfrage zweimal schreiben müssen, was schmerzhaft ist (außer MS Access 2003 unterstützt die 'WITH'-Klausel oder den allgemeinen Tabellenausdruck).
Aber würde es keine einzelne Abfrage geben, um diese erforderliche Ausgabe zu erhalten?
Die UNION ist natürlich eine einzelne Abfrage. Ich nehme an, du könntest einfach schreiben:
%Vor%Ich kann mir nicht sofort eine kompaktere Art der Abfrage vorstellen.
Die akzeptierte Antwort auf die andere Frage hat zwei mögliche Lösungen (in der Fassung von Kommentaren und umformatiert):
%Vor%Oder:
%Vor%Wie in einem Kommentar erwähnt, führt das Fehlen des Tabellennamens in der Frage zu unterschiedlichen Tabellennamen, die in der Antwort erscheinen; Was ich Patient Movements nannte, wurde in dieser Antwort YourTable genannt. Der andere Unterschied besteht darin, dass die ursprüngliche Frage die Spalten "Unit" oder "DischargeDate" in den Daten nicht enthielt. Die UNION-Abfrage, die ich angegeben habe, gibt jedoch die relevanten Daten an, auf denen diese Abfragen ausgeführt werden sollen. Sie müssen lediglich die UNION-Abfrage in die anderen Antworten anstelle von YourTable schreiben. Dies führt zu:
%Vor%Oder:
%Vor%Also, solange Sie vorsichtig sind und Abfragen in Fragmenten entwickeln und diese dann konsistent kombinieren, kann die schrecklichste Abfrage gezähmt werden.
Beachten Sie, dass der SQL-Standard "allgemeine Tabellenausdrücke" (CTEs) hat, die als "WITH-Klauseln" bekannt sind und die Dinge noch einfacher machen können.
%Vor%Oder:
%Vor%Einer der Hauptvorteile der Verwendung eines CTE besteht darin, dass dem Optimierer explizit gesagt wird, dass die Tabellenausdrücke an allen Stellen, an denen er verwendet wird, gleich sind, während er beim mehrfachen Auszeichnen diese Gemeinsamkeit möglicherweise nicht erkennt. Außerdem führt das mehrfache Schreiben der Abfrage zu der Möglichkeit, dass die beiden Abfragen, die darauf ausgerichtet sind, die gleichen zu sein, aufgrund eines Bearbeitungsfehlers tatsächlich geringfügig voneinander abweichen. Diese Möglichkeit wird vom CTE ausgeschlossen. Der andere Vorteil im gegenwärtigen Kontext war, dass die Kombination des CTE mit den Lösungen für die andere Frage ein Kinderspiel war.
Leider ist es unwahrscheinlich, dass MS Access 2003 CTEs unterstützt. Ich teile deinen Schmerz; das DBMS, mit dem ich arbeite, funktioniert auch nicht.