Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Vermessungsbüro-Abfragen

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von Ithron, 19 Juni 2013.

  1. Ithron

    Ithron Neuer Benutzer

    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 ;)

    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 :)
     
  2. ukulele

    ukulele Datenbank-Guru

    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.
     
    Ithron gefällt das.
  3. Ithron

    Ithron Neuer Benutzer

    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 :)
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden