Abfrageprobem über mehrere Tabellen
am 28.03.2007 18:31:05 von Tobias
Hallo,
ich habe ein Abfrageproblem über mehrere Tabellen.
Folgende Tabellen stehen zur Verfügung:
*= Primärschlüssel
Tabelle: vertraege
vertrag_id *
vbez
Tabelle: kontingente
kontingent_id *
vertrag_id
kontbez
max_dauer
Tabelle: anfragen
anfrage_id *
geschlossen
titel
datum
kontingent_id
vertrag_id
Tabelle: antworten
antwort_id *
anfrage_id
dauer
updated
nicht_abrechnen
Folgende Abfrage funktioniert soweit, bis darauf das das Feld
nicht_abrechnen nicht berücksichtigt ist.
SELECT count(antworten.antwort_id ) AS anzahl_antworten,
kontingente.max_dauer,
sum( antworten.dauer ) AS dauer_gesamt,
anfragen.titel,
vertraege.vbez,
kontingente.kontbez,
antworten.updated
FROM
vertraege
LEFT JOIN kontingente ON ( kontingente.vertrag_id = vertraege.vertrag_id)
LEFT JOIN anfragen ON ( anfragen.kontingent_id =
kontingente.kontingent_id AND kontingente.vertrag_id =
vertraege.vertrag_id AND anfragen.geschlossen=0)
LEFT JOIN antworten ON ( antworten.anfrage_id = anfragen.anfrage_id )
WHERE vertraege.vertrag_id=anfragen.vertrag_id
GROUP BY anfragen.anfrage_id
ORDER BY anfragen.datum DESC,updated DESC
Im Moment wird die Summe der Einzeldauer aller Antworten ausgegeben. Ich
benötige aber die Summe aller Einzeldauer die das Feld nicht_berechnen=0
haben, damit nur die Antworteinträge summiert werden die auch das Flag
berechnen haben.
Kann ich das in einer Abfrage überhaupt hinbekommen oder benötige ich
mehrere Abfragen, da ich ja bei anzahl_antworten ALLE Antworten als Flag
nicht_berechnen=1 und nicht_berechnen=0 benötige.
Danke im Voraus,
Gruss,
Tobias
Re: Abfrageprobem über mehrere Tabellen
am 28.03.2007 18:50:27 von Dominik Echterbruch
Tobias schrieb:
>
> SELECT count(antworten.antwort_id ) AS anzahl_antworten,
> kontingente.max_dauer,
> sum( antworten.dauer ) AS dauer_gesamt,
>
> Im Moment wird die Summe der Einzeldauer aller Antworten ausgegeben. Ich
> benötige aber die Summe aller Einzeldauer die das Feld nicht_berechnen=0
> haben, damit nur die Antworteinträge summiert werden die auch das Flag
> berechnen haben.
>
> Kann ich das in einer Abfrage überhaupt hinbekommen oder benötige ich
> mehrere Abfragen, da ich ja bei anzahl_antworten ALLE Antworten als Flag
> nicht_berechnen=1 und nicht_berechnen=0 benötige.
Ja, das geht, wenn du die Dauer nur unter der Bedingung, daß die Spalte
nicht_berechnen = 0 ist, berücksichtigst. Dazu kennt SQL das CASE Konstrukt:
CASE WHEN nicht_berechnen = 0 THEN antworten.dauer ELSE 0 END
Wie du das in deine Abfrage einbaust, überlasse ich dir mal zur Übung
selbst.
Grüße,
Dominik
Re: Abfrageprobem über mehrere Tabellen
am 29.03.2007 13:23:53 von Tobias
Dominik Echterbruch schrieb:
> Tobias schrieb:
>>
>> Kann ich das in einer Abfrage überhaupt hinbekommen oder benötige ich
>> mehrere Abfragen, da ich ja bei anzahl_antworten ALLE Antworten als
>> Flag nicht_berechnen=1 und nicht_berechnen=0 benötige.
>
> Ja, das geht, wenn du die Dauer nur unter der Bedingung, daß die Spalte
> nicht_berechnen = 0 ist, berücksichtigst. Dazu kennt SQL das CASE
> Konstrukt:
> CASE WHEN nicht_berechnen = 0 THEN antworten.dauer ELSE 0 END
>
> Wie du das in deine Abfrage einbaust, überlasse ich dir mal zur Übung
> selbst.
OK, Super das funktioniert.
Jetzt taucht auch schon das nächste Problem auf.
In der Tabelle antworten befinden sich 2 Datumsfelder und ich möchte im
Ergebnis das Datum der neuesten Antwort anzeigen lassen.
Ich habe folgende Abfrage verwendet:
SELECT count(antworten.antwort_id ) AS anzahl_antworten,
kontingente.max_dauer,
sum( CASE WHEN A1.nicht_berechnen=0 THEN A1.leistungsdauer ELSE 0 END )
AS anzahl_h_verbraucht_berechnen,
sum( antworten.dauer ) AS dauer_gesamt,
anfragen.titel,
vertraege.vbez,
kontingente.kontbez,
if (A1.updated<>'',A1.updated,A1.erstellt) AS updated_last,
FROM
vertraege
LEFT JOIN kontingente ON ( kontingente.vertrag_id = vertraege.vertrag_id)
LEFT JOIN anfragen ON ( anfragen.kontingent_id =
kontingente.kontingent_id AND kontingente.vertrag_id =
vertraege.vertrag_id AND anfragen.geschlossen=0)
LEFT JOIN antworten A1 ON ( A1.anfrage_id = anfragen.anfrage_id )
LEFT JOIN antworten A2 ON (A1.antwort_id=A2.antwort_id AND A2.updated >
A1.updated)
LEFT JOIN antworten A3 ON (A1.antwort_id=A3.antwort_id AND A3.erstellt >
A1.erstellt)
WHERE vertraege.vertrag_id=anfragen.vertrag_id
AND A2.updated IS NULL
AND A3.erstellt IS NULL
GROUP BY anfragen.anfrage_id
ORDER BY anfragen.datum DESC,updated_last DESC
Somit bekommt updated_last entweder das erstellt Datum oder das updated
Datum.
Allerdings bekomme ich immer das älteste anstatt das neueste Datum.
Was mache ich falsch bzw. wie kann ich die Sortierung umkehren. Ich
dachte durch die ON Bedingungen bei A2 und A3 sollte die Reihenfolge
korrekt sein, oder liege ich falsch?
Danke im Voraus,
Gruss
Tobias