Vermessungsbüro-Abfragen

Ithron

Neuer Benutzer
Beiträge
2
Hallo liebes Datenbank-Forum :)

Ich wurde auf Arbeit gefragt, ob ich nicht ein paar SQL-Abfragen erstellen könnte, die die Arbeit erleichtern würden. Da ich der einzige in der Firma mit SQL-Kenntnissen bin, hab ich natürlich zugestimmt und mir nichts weiter dabei gedacht. Wie schwer können schon ein paar Abfragen sein ;)

Als Randinfo, es handelt es sich um ein Vermessungsbüro und die Abfragen sollen in die Software GeoBüro eingebunden werden.

Es gibt Unmengen an Tabellen, in die ich mich erstmal reinfinden musste. Beispielsweise gibt es eine Tabelle für die Aufträge, dann gibt es eine Tabelle für die verschiedenen Vorgänge in diesen Aufträgen und wieder diverse andere Tabellen für Auftragsarten und so weiter. Alles ziemlich weitflächig aufgeteilt und verknüpft.

Das macht dann Abfragen nicht sonderlich leicht, wenn man mehrere Kriterien betrachten muss. Meine SQL-Kenntnisse sind auch etwas eingerostet und ich hatte mich schonmal an Subquerys probiert, aber das funktionierte auch nicht so, wie gedacht.

Ich werf dann einfach mal eine der gewünschten Abfragen in den Raum, vielleicht ist es ja gar nicht so kompliziert und ich stell mich nur blöd an ;)

Alle Aufträge, bei denen die Vermessungsunterlagen da sind, aber noch keine Messung im AD (Außendienst) stattgefunden hat
= Endedatum beim Vorgang "Vermessungsunterlagen sind bestellt" (AVU0), aber kein Vorgang "Messung im AD" (ADB)
-> Vorgang "Messung im AD" muss konsequent gesetzt werden
Aus diesem "Auftrag" hab ich erstmal folgenden Code erstellt:

Code:
SELECT        GBAuftrag.Nummer AS Auftragsnummer, GBAuftrag.Objekt, GBAuftrag.Lage, GBAuftragsart.Name AS Auftragsart, GBAuftrag.Betreff, GBVorgangsart.Kurzname,
            GBVorgangsart.Name AS Vorgangsart, GBVorgang.Ende
 
FROM        GBAuftrag INNER JOIN
            GBAuftragsart ON GBAuftrag.[#Auftragsart] = GBAuftragsart.ID INNER JOIN
            GBVorgang ON GBAuftrag.ID = GBVorgang.[#Auftrag] INNER JOIN
            GBVorgangsart ON GBVorgang.[#Vorgangsart] = GBVorgangsart.ID
 
WHERE        DATEDIFF(day, GBVorgang.Datum, CURRENT_TIMESTAMP)<=730
            AND GBVorgang.Ende IS NOT NULL
            AND GBVorgangsart.Kurzname = 'AVU0'
            AND GBVorgangsart.Kurzname != 'ADB'
 
ORDER BY    GBAuftrag.Nummer;

Nun ist es aber der Fall, dass die Kurzbezeichnungen für die Vorgänge ja in der gleichen Spalte der Tabelle liegen, also gibt er mir in der derzeitigen Lage nur die Daten aus, die vorhanden sind, aber zeigt mir nicht an, wo noch der Außendienst fehlt. Hier steh ich irgendwie auf dem Schlauch, wie man das kombinieren könnte und wäre über ein paar andere Ansichten oder Lösungsansätze sehr dankbar, denn die folgenden "Wünsche" der Kollegen werden nicht leichter von der Fomulierung :D

Dann danke ich Euch schonmal für eure Zeit und eure Ideen.

LG, Ithron :)
 
Werbung:

ukulele

Datenbank-Guru
Beiträge
4.697
Es fällt mir nicht ganz leicht dir zu folgen aber ich versuchs mal.

Du hast 2 Tabellen mit Informationen zum Auftrag und 2 zum Vorgang. Jeder Auftrag hat 1-n Vorgänge. (Warum 2 Tabellen für Vorgangsinformationen verstehe ich noch nicht so ganz aber scheint mir nicht wichtig.) Du suchst Aufträge die zwar den Vorgang AVU0 haben aber zu denen kein Vorgang mit Vorgangsart ADB vorliegt.

In diesem Fall müsstest du die Vorgangstabellen 2 mal betrachten. Einmal muss es einen Eintrag geben und ein ander mal nicht, du darfst aber nicht den Kurznamen eines Eintrags einfach 2x prüfen. Wenn er AVU0 lautet ist er ja sowieso != ADB. Du musst immer nach 2 Vorgangsarten zu einem Auftrag suchen und zur Unterscheidung solltest du Aliase für die Tabellen nehmen. Ich hab das mal probiert und mit NOT EXISTS alle Aufträge ausgeschlossen zu denen ein Vorgang ADB existiert.
Code:
SELECT    GBAuftrag.Nummer AS Auftragsnummer,
        GBAuftrag.Objekt, GBAuftrag.Lage,
        GBAuftragsart.Name AS Auftragsart,
        GBAuftrag.Betreff,
        GBVorgangsart.Kurzname,
        GBVorgangsart.Name AS Vorgangsart,
        GBVorgang.Ende
FROM    GBAuftrag
INNER JOIN GBAuftragsart ON GBAuftrag.[#Auftragsart] = GBAuftragsart.ID
INNER JOIN GBVorgang v1 ON GBAuftrag.ID = v1.[#Auftrag]
INNER JOIN GBVorgangsart va1 ON v1.[#Vorgangsart] = va1.ID
WHERE    DATEDIFF(day, GBVorgang.Datum, CURRENT_TIMESTAMP)<=730
AND        v1.Ende IS NOT NULL
AND        va1.Kurzname = 'AVU0'
AND NOT EXISTS (    SELECT    1
                    FROM    GBVorgang v2
                    INNER JOIN GBVorgangsart va2 ON v2.[#Vorgangsart] = va2.ID
                    WHERE    GBAuftrag.ID = v2.[#Auftrag]
                    AND        va2.Kurzname = 'ADB' )
ORDER BY GBAuftrag.Nummer;
Kann aber auch sein das ich falsch liege, dann solltest du mal ein kleines ERD mit den Zusammenhängen der Tabellen malen, zum Verständniss.
 
Werbung:

Ithron

Neuer Benutzer
Beiträge
2
Ich habe die Tabellen leider nicht erstellt, daher weiß ich auch nicht, warum sie so verschachtelt und aufgeteilt wurden :rolleyes: Da steckt ja das GeoBüro-Programm dahinter, welches die anlegt.
Hab deine Anfrage mal getestet und auf den ersten Blick scheint sie zu funktionieren, zumindest hab ich nun weniger Ergebnisse als mit meiner falaschen ;) und wenn ich stichprobenartig in diese reinschaue, dann sind zumindest die gefragten Kriterien erfüllt, danke :D

Der Lösungsansatz mit dem 2 mal betrachten ist so logisch und ich meine mich zu erinnern, dass wir das früher im Studium auch mal hatten :oops: Nun sollte der Rest leichter fallen, vielen Dank nochmal :D Zur Not melde ich mich erneut, wenns nochmal Probleme gibt, aber das ist erstmal beantwortet :)
 
Oben