Announcement

Collapse
No announcement yet.

komplexe Abfragen ...

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • komplexe Abfragen ...

    Hallo,

    ich habe folgendes Problem. Um Umsatzauswertungen unserer Krankenfahrten durchzuführen, versuche ich seid geraumer Zeit eine vernünftige SQL-Abfrage hinzubekommen, bisher habe ich diese auf Programmtechnischer Seite, also jeder Datensatz einzeln, durchgeführt. Bei einer Auswertung von mehreren Jahren oder eine Simulation für zukünftige Tarife der Krankenkassen kann dieser Vorgang mehrer Minuten dauern, und mal ehrlich, Zeit ist doch wirklich etwas sehr kostbares.

    Also folgende Ausgangsituation:

    Die Tabellen:

    <b>Patienten</b>: ID, (....), Krankenkasse
    <b>Krankenkasse</b>: ID, (....), Tarif
    <b>Tarif</b>: ID, (...)
    <b>Tarif_Entfernungen</b>: ID, Tarif_ID, Gueltig_ab, Serie, Einfach, Sammel, Von_km, Bis_km, Einstieg, proTour, leerKM, besetztKM
    <b>Auftraege</b>: ID, Patient_ID, Datum, Serie, Einfach, Sammel, Kilometer (...)

    Einen Zusammenhang zwischen den <b>Auftraegen, Patienten, Krankenkassen</b> und der Tabelle <b>Tarif</b> herzustellen ist kein Problem

    <b>Syntax</b>
    select f.datum, p.id as Patient, k.id as Kasse, kt.id as Tarif, f.Kilometer, f.serienbehandlung, f.transportschein
    from fahrauftraege f
    left join patienten p on (f.Patient_ID = p.id)
    left join krankenkassen k on (p.kasse = k.id)
    left join kassentarife kt on (k.tarifsatz = kt.id)
    where f.zaehler = :Patient_ID and f.jahr = :Jahr

    Ergebnis-Beispiel:
    Datum Patient Kasse Tarif Kilometer Serie Einfach
    2005-09-03 21 1 2 9 F T
    .
    .
    .
    usw.

    ich habe dieses hier mit einem LEFT JOIN gelöst natürlich ist auch ein einfaches WHERE möglich da ID's-Verbindungen zu den jeweiligen Tabellen komplett sind. Das Problem besteht in dem einfügen der Tabelle Tarif_Entfernung.

    Hier sind die eigentlichen werte enthalten, Als Berechnungsgrundlage ist hier natürlich abhängig vom Datum des Auftrages der "Älteste" Tarif zu nutzen, also Tarif_Entf.gueltig_ab <= Auftrag.datum

    Füge ich nun diese Tabelle ebenfalls durch z.B. Left join oder where ein so werden mir für den Auftrag mehrer Zeilen ausgegeben da eine Spalte gueltig_bis nicht vorhanden ist.

    Ergebnis-Beispiel:
    Datum Patient (...) Gueltig_ab Einstieg proTour ...
    2005-09-03 21 ... 2003-09-01 2,56 € 0,00 €
    2005-09-03 21 ... 1997-06-01 0,00 € 2,00 €
    .
    .
    .
    usw.

    dieses Ergebnis ist natürlich nicht richtig.
    Ich so langsam am verzweifeln, ob mit Group by, Order By oder ähnlichem, es folgt einfach nicht das richtige Ergebnis. Auch das erstellen einer Temporären Tabelle un dem späteren Auffüllen mit den Daten also das Auffüllen mit den Grunddaten und der späteren Berechnung mit Update Table kam zu keinem Ergebnis.

    Wer kann mir weiterhelfen.

    cu Jan

  • #2
    Hallo Jan,

    Problem schon gelöst ?
    Habe zwar länger nix mehr mit SQL gemacht, aber hast du
    schon versucht, in die WHERE-Bedingung ein MAX(gueltig_ab)
    einzubauen ? (kann z.Z. leider nicht testen und bin mir auch nicht
    ganz sicher, ob das Sinn macht)

    Zur Performance: Wie wäre es, wenn du eine View verwendest ?

    Gruss
    Carste

    Comment


    • #3
      Hallo Jan,

      hier eine mögliche Lösung als SQL-Schnipsel

      WHERE Tarif_Entf.gueltig_ab <= Auftrag.datum ORDER BY Tarif_Entf.gueltig_ab DESC LIMIT 1

      Durch die ORDER BY - Klausel ist der gewünschte Datensatz der erste. Durch LIMIT 1 wird nur dieser ausgegeben. Das wars.

      Ich hoffe, ich konnte Dir helfen, wenn Du das Problem noch nicht gelöst hast.

      Gruß Han

      Comment

      Working...
      X