Markus: SQL Aufgabe

Hallo!

Ich mache gerade eine Einschulung in SQL. Und hänge bei einem Beispiel.
Könnt Ihr mir da vielleicht weiterhelfen?

Aufgabe:
Schreiben Sie eine zusammengesetzte Abfrage, um eine Angestelltenliste zu erstellen, die Prozentsätze von Gehaltserhöhungen, Angestellten-IDs sowie altes und neues Gehalt angibt. Angestellte in den Abteilungen 20, 60 und 90 erhalten eine Gehaltserhöhung von 6 %, Angestellte in Abteilung 50 eine Gehaltserhöhung von 11 %, Angestellte in den Abteilungen 10 und 80 eine Gehaltserhöhung von 14 %, und Angestellte in Abteilung 110 erhalten keine Gehaltserhöhung.

======

Folgendes habe ich schon geschafft, aber jetzt weiß ich nicht mehr weiter.

select employee_id,salary
from   employees
where  department_id in (20, 60, 90)

Liebe Grüße
Markus

  1. Möchtest du einfach das Ergebnis hingeknallt bekommen, oder möchtest du den Weg lernen?

    In Abhängigkeit deines Datenbanksystems und dessen SQL Features:

    • du kannst die Aufgabe mit einem UNION und WHERE lösen
    • du kannst die Aufgabe mit einem CASE WHEN department_Id=90 THEN .... END lösen

    Also für dich:
    1. Schritt: Mit welchem Datenbanksystem in welcher Version arbeite ich
    2. Schritt: Wo finde ich dazu die Dokumentation
    3. Schritt: Beschräftige dich mit den Basisoperatoren wie + und speziell *
    4. Schritt: Suche in der Doku nach dem UNION Operator und probier die Beispiele aus, alternativ für den CASE Operator (steht sicher irgendwo in der näheren Umgebung von IF)
    5. Schritt: Baue das gelernte in deine Abfrage ein

    Gruss, Frank

    1. Hallo!

      Du würdest mir schon Helfen wenn Du mir einfach dass Ergebnis zeigen würdest.

      Ich habe ja eine SQL Mappe mit Grundlagen wo alles beschrieben steht, aber bei diesem Beispiel sitze ich irgendwie auf der Leitung.

      Liebe Grüße
      Markus

      1. Hoi,

        SQL Mappe mit Grundlagen wo alles beschrieben steht

        Alles, ja? Ich meinte sicher nicht deine Schulungsmappe, sondern die Dokumentation (oder auch Onlinehilfe) deines Datenbankservers.

        DIESE HIER zum Bleistift

        Du würdest mir schon Helfen wenn Du mir einfach dass Ergebnis zeigen würdest.

        Das hab ich mir schon fast gedacht.

          
        SELECT  name,  
                      salary as SalaryOld,  
                      0.06 AS SalaryRaise,  
                      ((salary*0.06)+salary) AS SalaryNew  
        FROM employees  
        WHERE department_id IN (20, 60, 90)  
        UNION  
        SELECT  name,  
                      salary as SalaryOld,  
                      0.04 AS SalaryRaise,  
                      ((salary*0.04)+salary) AS SalaryNew  
        FROM employees  
        WHERE department_id IN (50, 70)  
        UNION  
        SELECT  name,  
                      salary as SalaryOld,  
                      0.00 AS SalaryRaise,  
                      ((salary*0.00)+salary) AS SalaryNew  
        FROM employees  
        WHERE department_id IN (110)  
        
        

        alternativ

          
        SELECT name  
                      salary AS SalaryOld,  
                      case department_id  
                              WHEN 20 THEN  ((salary*0.06)+salary)  
                              WHEN 60 THEN  ((salary*0.06)+salary)  
                              -- und so weiter  
                      end AS SalaryNew  
        FROM employees  
        
        

        Wo ist jetzt der Lerneffekt?

        Grüsse
        Frank

        1. yo Frank,

          UNION ALL ist hier besser.

          Ilja

          1. Hi Ilya,

            könntest du bitte auch erklären warum?

            Danke, Frank

            1. yo,

              könntest du bitte auch erklären warum?

              ein UNION wird immer auf doppelte ausgabe-werte prüfen und sie rausfiltern, eine UNION ALL macht genau das nicht, was hier auch nicht gewünscht ist.

              MeisterEder

              1. Schön und gut, Meister Eder!

                ein UNION wird immer auf doppelte ausgabe-werte prüfen

                Und wie sollten doppelte Ausgabewerte denn bei dieser Abfrage und dem Datenmodell zu Stande kommen?

                Employee (Name, Salary, DepartmentId)

                Ein Angestellter ist also direkt einer DepartmentId zugeordnet. Von einem komplizierteren Datenmodell (mit Joints und so ;)) war bislang nicht die Rede.

                Also UNION ALL ist an der Stelle sicher nicht falsch. :L

                Gruss, Frank

    2. Hallo!

      Weil du nach dem Datenbanksystem gefragt hast. Ich arbeite gerade mit dem PL/SQL Developer von Allroundautomations v 7.0 auf einer Oracle Database 10g Enterprise Edition Release 10.2.0.3.0

      Liebe Grüße
      Markus

  2. yo,

    ich habe den begriff "zusammengesetzte Abfrage" so noch nicht gehört, vielleicht soll damit UNION gemeint sein, halte ich aber für fragwürdig, zumal hier auch eher UNION ALL in anwendung kommen sollte. ich würde da noch mal nachfragen, ob du wirklich UNION ALL anwenden sollst oder ob du es eben auch mit anderen mitteln lösen kannst. frank hat da ja schon CASE verzweigung angesprochen.

    Ilja

  3. Hallo!

    SO!

    Ich bin jetzt, durch die Hilfe eines Kollegen, zu einem Ergebnis gekommen.

    Die Abfrage geht folgendermaßen:

    ====
    select employee_id, salary, '6%' "%", 1.06*salary "New Salary"
    from   employees
    where  department_id in (20, 60, 90)
    union
    select employee_id, salary, '11%', 1.11*salary
    from   employees
    where  department_id = 50
    union
    select employee_id, salary, '14%', 1.14*salary
    from   employees
    where  department_id in (10, 80)
    union
    select employee_id, salary, '0%' , 1.00*salary
    from   employees
    where  department_id = 110

    Liebe Grüße
    Markus