Auswertung im GTDS • • • • fixe Abläufe für Standard-Aufgaben – Mamma-Auswertung – Kolorekt-Auswertung vorgefertigte Berichte ( Leitstelle Berichtsauswahl ) Berichtsaufruf in der Auswertungs-Ansicht ( Funktion Druck/Ausg. ) Variable Auswertungen je nach Anforderung Tabelle als Grundelement Die Daten des GTDS werden in einer relationalen Datenbank gespeichert. Auswertung bedeutet nichts anderes, als daraus die gewünschten Daten in der gewünschten Form herauszuholen. Grundelement einer relationalen Datenbank ist die Tabelle, z.B. ergibt sich durch folgendes SQL : SQL> l 1 select Pat_ID, Name, Vorname, Geburtsdatum 2 from PATIENT 3 where ...... So eine Tabelle : PAT_ID NAME VORNAME GEBURTSDAT ---------- --------------- ---------- ---------1581 Abrechnungstest Hermine 31.12.1899 1602 Prostata Hans 11.11.1911 1622 B97test Fritz 11.11.1911 1623 B97test Fritz 11.11.1911 Tabelle als Grundelement (II) PATIENT PAT_ID NAME VORNAME GEBURTSDAT ---------- --------------- ---------- ---------1581 Abrechnungstest Hermine 31.12.1899 1602 Prostata Hans 11.11.1911 1622 B97test Fritz 11.11.1911 1623 B97test Fritz 11.11.1911 • Tabelle hat einen bestimmten Namen ( hier PATIENT ) • Spalten haben bestimmte Namen ( hier PAT_ID , NAME usw.) • Spalten haben Datentypen ( vereinfacht : Zahlen , Text oder Datum ) • Anzahl und Typ der Spalten ist für alle Zeilen konstant • Daten stehen in den einzelnen Zeilen (hier sind es 4) Grundlagen SQL (I) nähere Einzelheiten siehe SQLKURS - Skript PATIENT PAT_ID NAME VORNAME GEBURTSDAT ---------- --------------- ---------- ---------1581 Abrechnungstest Hermine 31.12.1899 1602 Prostata Hans 11.11.1911 1622 B97test Fritz 11.11.1911 1623 B97test Fritz 11.11.1911 Wenn die Tabelle PATIENT nur diese vier Zeilen enthält, genügt zur Ausgabe folgendes : select Pat_ID, Name, Vorname, Geburtsdatum from PATIENT ; Grundlagen SQL (II) PATIENT PAT_ID NAME VORNAME GEBURTSDAT ---------- --------------- ---------- ---------1581 Abrechnungstest Hermine 31.12.1899 1602 Prostata Hans 11.11.1911 1622 B97test Fritz 11.11.1911 1623 B97test Fritz 11.11.1911 Auswahl einzelner Spalten in der SELECT - Liste select Name, Vorname, Geburtsdatum from PATIENT ; NAME --------------Abrechnungstest Prostata ........ VORNAME ---------Hermine Hans GEBURTSDAT ---------31.12.1899 11.11.1911 Grundlagen SQL (III) PATIENT PAT_ID NAME VORNAME GEBURTSDAT ---------- --------------- ---------- ---------1581 Abrechnungstest Hermine 31.12.1899 1602 Prostata Hans 11.11.1911 1622 B97test Fritz 11.11.1911 1623 B97test Fritz 11.11.1911 Auswahl einzelner ZEILEN mit der where – Klausel select Pat_ID, Name, Vorname, Geburtsdatum from PATIENT where Name = 'Prostata' ; PAT_ID NAME VORNAME GEBURTSDAT ---------- --------------- ---------- ---------1602 Prostata Hans 11.11.1911 Grundlagen SQL (IV) PATIENT PAT_ID NAME VORNAME GEBURTSDAT ---------- --------------- ---------- ---------1581 Abrechnungstest Hermine 31.12.1899 1602 Prostata Hans 11.11.1911 1622 B97test Fritz 11.11.1911 1623 B97test Fritz 11.11.1911 where – Klausel, mehrere Teile mit AND (oder OR) verbunden select Pat_ID, Name, Vorname, Geburtsdatum from PATIENT where Name = 'B97test' AND Vorname = 'Fritz'; PAT_ID ---------1622 1623 NAME --------------B97test B97test VORNAME ---------Fritz Fritz GEBURTSDAT ---------11.11.1911 11.11.1911 Grundlagen SQL (V) PAT_ID ---------1622 1623 NAME --------------B97test B97test VORNAME ---------Fritz Fritz GEBURTSDAT ---------11.11.1911 11.11.1911 where – Klausel für Zahlen select Pat_ID, Name, Vorname, Geburtsdatum from PATIENT where Pat_ID = 1622 ; Die Spalte Pat_ID ist hier die einzige, welche es erlaubt, über eine where-Klausel eine bestimmte Zeile der beiden "B97test" herauszufinden. Nur mit Name, Vorname und Geburtsdatum wäre der Zugriff nur auf einen von beiden nicht möglich. Sie erfüllt hier die Funktion eines sog. Primärschlüssels Grundlagen SQL (VI) Order by – Klausel ordnet die Daten nach den angegebenen Feldern : select Pat_ID, Name, Vorname, Geburtsdatum from PATIENT order by Name, Vorname ; PAT_ID NAME VORNAME GEBURTSDAT ---------- --------------- ---------- ---------1581 Abrechnungstest Hermine 31.12.1899 1622 B97test Fritz 11.11.1911 1623 B97test Fritz 11.11.1911 1602 Prostata Hans 11.11.1911 Tabellen verbinden (Join) • eine Datenbank besteht gewöhnlich aus zahlreichen Tabellen, bei GTDS z.B. ca. 200 • zwischen diesen Tabellen bestehen Beziehungen, einfaches Beispiel PATIENT TUMOR • die Zuordnung der einzelnen Datensätze erfolgt in einer relationalen Datenbank ausschließlich durch "normale", sichtbare Tabellenspalten, es gibt keine verdeckten "Pointer" usw. Tabellen verbinden (Join) – Beispiel (a) PAT_ID NAME VORNAME GEBURTSDAT ---------- --------------- ---------- ---------1581 Abrechnungstest Hermine 31.12.1899 1622 B97test Fritz 11.11.1911 1623 B97test Fritz 11.11.1911 1602 Prostata Hans 11.11.1911 Zu den bereits bekannten Patienten existiert eine Tabelle mit deren Tumoren : Fk_Patient Pat_ID ---------1581 1581 Tumor ID ----1 2 1602 1 1622 1 Diagnose datum -------28.12.99 01.02.03 ICD10 ---------C50 C18 01.07.97 C61 19.08.96 C61 DIAGNOSETEXT ---------------Mammakarzinom li. Kolonkarzinom Prostatakarzinom Prostatakarzinom Tabellen verbinden (Join) – Beispiel (b) Die Beziehung der Datensätze ist einfach zu sehen, begründet in der jeweils gleichen PAT_ID : PAT_ID NAME VORNAME GEBURTSDAT ---------- --------------- ---------- ---------1581 Abrechnungstest Hermine 31.12.1899 1622 B97test Fritz 11.11.1911 1623 B97test Fritz 11.11.1911 1602 Prostata Hans 11.11.1911 Fk_Patient Pat_ID ---------1581 1581 Tumor ID ----1 2 1602 1 1622 1 Diagnose datum -------28.12.99 01.02.03 ICD10 ---------C50 C18 01.07.97 C61 19.08.96 C61 DIAGNOSETEXT ---------------Mammakarzinom li. Kolonkarzinom Prostatakarzinom Prostatakarzinom Tabellen verbinden (Join) – Beispiel (c) Realisierung in SQL : select PATIENT.Pat_ID, PATIENT.Name, PATIENT.Vorname, TUMOR.Fk_PatientPat_ID, TUMOR.Tumor_ID, TUMOR.Diagnosedatum, TUMOR.ICD10 from PATIENT, TUMOR where PATIENT.Pat_ID = TUMOR.Fk_PatientPat_ID ; PAT_ID -----1581 1581 1602 1622 NAME --------------Abrechnungstest Abrechnungstest Prostata B97test VORNAME ------Hermine Hermine Hans Fritz Fk_Patient Pat_ID ---------1581 1581 1602 1622 Tumor ID ----1 2 1 1 Diagnose datum -------28.12.99 01.02.03 01.07.97 19.08.96 ICD10 --C50 C18 C61 C61 Tabellen verbinden (Join) – Beispiel (d) vereinfachte Version in SQL : der Name der Tabelle muß nur dann vor den Spaltennamen stehen, wenn eine Spalte mit gleichem Namen in beiden Tabellen vorkommt (hier nicht) select Pat_ID, Name, Vorname, Fk_PatientPat_ID, Tumor_ID, Diagnosedatum, ICD10 from PATIENT, TUMOR where Pat_ID = Fk_PatientPat_ID ; PAT_ID -----1581 1581 1602 1622 NAME --------------Abrechnungstest Abrechnungstest Prostata B97test VORNAME ------Hermine Hermine Hans Fritz Fk_Patient Pat_ID ---------1581 1581 1602 1622 Tumor ID ----1 2 1 1 Diagnose datum -------28.12.99 01.02.03 01.07.97 19.08.96 ICD10 --C50 C18 C61 C61 Tabellen verbinden (Join) – Beispiel (e) vereinfachte Version in SQL II: in der from – Klausel kurze Aliasnamen angeben und bei select und where verwenden select P.Pat_ID, P.Name, P.Vorname, T.Fk_PatientPat_ID, T.Tumor_ID, T.Diagnosedatum, T.ICD10 from PATIENT P, TUMOR T where P.Pat_ID = T.Fk_PatientPat_ID ; PAT_ID -----1581 1581 1602 1622 NAME --------------Abrechnungstest Abrechnungstest Prostata B97test VORNAME ------Hermine Hermine Hans Fritz Fk_Patient Pat_ID ---------1581 1581 1602 1622 Tumor ID ----1 2 1 1 Diagnose datum -------28.12.99 01.02.03 01.07.97 19.08.96 ICD10 --C50 C18 C61 C61 Tabellen verbinden (Join) – Beispiel (f) Join in Schreibweise Standard – SQL (bei Oracle ab ca. Version 9 verwendbar) select P.Pat_ID, P.Name, P.Vorname, T.Fk_PatientPat_ID, T.Tumor_ID, T.Diagnosedatum, T.ICD10 from PATIENT P JOIN TUMOR T ON P.Pat_ID = T.Fk_PatientPat_ID ; PAT_ID -----1581 1581 1602 1622 NAME --------------Abrechnungstest Abrechnungstest Prostata B97test VORNAME ------Hermine Hermine Hans Fritz Fk_Patient Pat_ID ---------1581 1581 1602 1622 Tumor ID ----1 2 1 1 Diagnose datum -------28.12.99 01.02.03 01.07.97 19.08.96 ICD10 --C50 C18 C61 C61 Tabellen verbinden – (Outer) Join 1. 2. 3. Die einfache Join-Abfrage verlangt, daß in allen abgefragten Tabellen mindestens eine passende Datenzeile existiert. Dabei werden immer alle Felder aus der SelectListe im Ergebnis gezeigt, auch wenn dadurch Daten mehrfach ausgegeben werden (Beispiel : zweimal Stammdaten von "Hermine Abrechnungstest" ) Sollen auch Daten angezeigt werden, bei denen die erste Bedingung nicht zutrifft, muß ein sog. Outer Join eingesetzt werden. Tabellen verbinden – Beispiel Outer Join "klassische" Oracle – Syntax : hinter der Spalte der Tabelle, für die es evtl. keine Daten gibt, wird (+) gesetzt : select P.Pat_ID, P.Name, P.Vorname, T.Fk_PatientPat_ID, T.Tumor_ID, T.Diagnosedatum, T.ICD10 from PATIENT P, TUMOR T where P.Pat_ID = T.Fk_PatientPat_ID(+) ; PAT_ID -----1581 1581 1602 1622 1623 NAME --------------Abrechnungstest Abrechnungstest Prostata B97test B97test VORNAME ------Hermine Hermine Hans Fritz Fritz Fk_Patient Pat_ID ---------1581 1581 1602 1622 Tumor ID ----1 2 1 1 Diagnose datum -------28.12.99 01.02.03 01.07.97 19.08.96 ICD10 --C50 C18 C61 C61 Tabellen verbinden – Beispiel Outer Join Standard – Syntax (bei Oracle ab ca. Version 9 verwendbar) am Schluß könnte noch eine where-Klausel folgen : select P.Pat_ID, P.Name, P.Vorname, T.Fk_PatientPat_ID, T.Tumor_ID, T.Diagnosedatum, T.ICD10 from PATIENT P LEFT OUTER JOIN TUMOR ON P.Pat_ID = T.Fk_PatientPat_ID ; PAT_ID -----1581 1581 1602 1622 1623 NAME --------------Abrechnungstest Abrechnungstest Prostata B97test B97test VORNAME ------Hermine Hermine Hans Fritz Fritz Fk_Patient Pat_ID ---------1581 1581 1602 1622 Tumor ID ----1 2 1 1 T Diagnose datum -------28.12.99 01.02.03 01.07.97 19.08.96 ICD10 --C50 C18 C61 C61 SQL : EXISTS - Unterabfrage PATIENT PAT_ID NAME VORNAME GEBURTSDAT ---------- --------------- ---------- ---------1581 Abrechnungstest Hermine 31.12.1899 1602 Prostata Hans 11.11.1911 1622 B97test Fritz 11.11.1911 1623 B97test Fritz 11.11.1911 Beispiel : Patienten, für die mindestens ein Tumor dokumentiert ist : select Pat_ID, Name, Vorname, Geburtsdatum from PATIENT P where EXISTS (select 'X' from TUMOR T where T.Fk_PatientPat_ID = P.Pat_ID) Der Vergleich mit vorigen Folien zeigt, daß Patient Nr. 1623 keinen Eintrag in der Tabelle TUMOR hat, er steht nicht mehr im Ergebnis (daher durchgestrichen). SQL : NOT EXISTS PATIENT PAT_ID NAME VORNAME GEBURTSDAT ---------- --------------- ---------- ---------1623 B97test Fritz 11.11.1911 Beispiel : Patienten, für die kein Tumor dokumentiert ist : select Pat_ID, Name, Vorname, Geburtsdatum from PATIENT P where NOT EXISTS (select 'X' from TUMOR T where T.Fk_PatientPat_ID = P.Pat_ID) Der Vergleich mit vorigen Folien zeigt, daß Patient Nr. 1623 keinen Eintrag in der Tabelle TUMOR hat, er steht allein im Ergebnis . GTDS – Tabellen in der Diagnosedaten-Maske • • • • • • • • • • TUMOR VORHANDENE_DATEN VORERKRANKUNGEN GKR TNM ANN_ARBOR SONSTIGE_KLASSIFIK LOKALISATION HISTOLOGIE AA_DIAGNOSESICHERUNG • • .... usw. .... für die Texte zu den Schlüsseln (z.B. ICD) sind weitere Tabellen ab- zufragen Spezialdokumentation z.B. für Mamma , Untersuchungen und Vorgesehene Maßnahmen kommen noch extra dazu Schlußfolgerung : Auswertung durch Abfragen auf die Originaltabellen des GTDS ist in den meisten Fällen zu schwierig und fehleranfällig Alles in einem : Auswertungs-Tabelle • Alle Grund-Daten zum Tumor in einer Tabelle, eine Zeile pro TUMOR (nicht pro Patient) • Extrakt – Prinzip – Daten werden jeweils durch ein komplexes Programm zusammengestellt – Aktualität / Datenstand entspricht dem Zeitpunkt, zu dem der Extrakt erstellt wurde, siehe Feld DATUM_DER_AUSWERTUNG , es wird nicht automatisch nachgeführt. – Mehrere Extrakte (im GTDS Auswertungs-Läufe) können nebeneinander existieren, unterschieden durch ihre VORGANG_ID