2025-04-17 13:18:29 +02:00

134 lines
5.2 KiB
SQL

-- Erstellen Sie SQL-Abfragen für die folgenden Aufgaben (Queries geben einen Punkt, sofern nicht anders angegeben):
-- 1) Selektieren Sie die Employee ID, Vornamen und Nachname aller Angestellten - sortieren Sie absteigend nach Nachname und dann nach Vorname.
SELECT emp_id, fname, lname
FROM employee
ORDER BY lname DESC, fname DESC;
-- 2) Holen Sie Kontonummer, Kundennummer und Kontostand für alle aktiven Konten mit mehr als 2500 Dollar (nutzen Sie als Kontostand avail_balance).
SELECT
account_id,
cust_id,
avail_balance
FROM account
WHERE
status = 'ACTIVE'
AND avail_balance > 2500;
-- 3) Holen Sie aus der Tabelle account alle IDs der Angestellten, die ein Konto eröffnet haben - geben Sie dabei jede ID nur einmal aus (Tipp: DISTINCT).
SELECT a.open_emp_id AS emp_id FROM account a GROUP BY a.open_emp_id;
-- 4) Zählen Sie die Zeilen in der account-Tabelle.
SELECT COUNT(a.account_id) AS Anzahl_Zeilen FROM account a;
-- 5) Geben Sie eine Tabelle aus, in der, in der ersten Spalte der Name des Kunden und in einer zweiten Spalte die Anzahl Konten dieses Kunden steht - Hinweis: hier reicht es aus, die Namen der Individualkunden zu verwenden (individual), Geschäftskunden dürfen ignoriert werden.
CREATE OR REPLACE VIEW AUFGABE_5 AS -- Der View ist hier nur für Aufgabe 6
SELECT CONCAT(i.lname, ' ', i.fname) AS Kunden_Name, COUNT(a.account_id) AS Anzahl_Konten
FROM account a
JOIN individual i ON i.cust_id = a.cust_id
GROUP BY
i.cust_id;
-- 6) Wie 5), aber zeigen Sie nur Kunden an, die 2 oder mehr Konten haben.
-- Kleiner Trick ^-^, Aufgabe 5 als View verwenden:
SELECT * FROM AUFGABE_5 WHERE Anzahl_Konten >= 2;
-- Alternative Lösung:
SELECT CONCAT(i.lname, ' ', i.fname) AS Kunden_Name, COUNT(a.account_id) AS Anzahl_Konten
FROM account a
JOIN individual i ON i.cust_id = a.cust_id
GROUP BY
i.cust_id
HAVING
COUNT(a.account_id) >= 2;
-- 7) Geben Sie eine Query an, die alle Accounts findet, die im Jahr 2002 eröffnet wurden, ohne die Symbole > oder < zu verwenden.
SELECT *
FROM account a
WHERE
a.open_date BETWEEN TIMESTAMP '2002-01-01' AND TIMESTAMP '2003-01-01';
-- 8) Geben Sie eine Query an, die alle Kunden ("individual") findet, deren Nachname an der zweiten Stelle ein 'a' danach an beliebiger Stelle ein 'e' enthält.
SELECT * FROM individual i WHERE REGEXP_LIKE(i.lname, '^.a.*e');
-- 9) Schreiben Sie eine Query, die alle Account-IDs für jeden Nicht-Geschäftskunden holt,
-- dazu die fed_id des Kunden und den Namen des Produkts, auf dem der Account basiert.
SELECT a.account_id, c.fed_id, p.name
FROM
customer c
JOIN account a ON c.cust_id = a.cust_id
JOIN product p ON a.product_cd = p.product_cd
WHERE
c.cust_type_cd != 'B';
-- 10) Schreiben Sie eine Query, die alle Angestellten findet,
-- deren Supervisor in einer anderen Abteilung (department) arbeitet.
-- Selektieren Sie ID, Vor- und Nachname.
SELECT e.emp_id AS ID, e.fname AS Vorname, e.lname AS Nachname
FROM employee e
JOIN employee e2 ON e.superior_emp_id = e2.emp_id
WHERE
e.dept_id != e2.dept_id;
-- 11) (2 Punkte) Selektieren Sie alle Vornamen und Nachnamen in einer Tabelle
-- (sowohl die der Individual-Kunden als auch die der Angestellten).
-- Tipp: Machen Sie sich mit der UNION-Anweisung vertraut.
SELECT fname, lname
FROM individual
UNION
SELECT fname, lname
FROM employee;
-- 12) (2 Punkte) Selektieren Sie folgende Tabelle: Vorgesetzter (Name), komma-getrennte Liste der Mitarbeiter,
-- die zu einem Vorgesetzten gehören.
SELECT
sup.lname AS Vorgesetzter,
STRING_AGG (
CONCAT(emp.fname, ' ', emp.lname),
', '
) AS Mitarbeiter
FROM employee emp
JOIN employee sup ON emp.superior_emp_id = sup.emp_id
GROUP BY
sup.emp_id;
-- 13) (2 Punkte) Selektieren Sie alle Account-IDs und die dazugehörige Customer-ID.
-- Wenn es ein Geschäftskunde ist, dann soll noch der Firmenname in der dritten Spalte stehen,
-- sonst soll in der dritten Spalte der Vor- und Nachname des Privatkunden stehen (Tipp: COALESCE).
SELECT c.cust_id,
STRING_AGG(a.account_id::text, ', ') AS Accounts,
COALESCE(b.name, CONCAT(i.fname, ' ', i.lname)) AS Kundenname
FROM account a
JOIN customer c ON a.cust_id = c.cust_id
LEFT JOIN business b ON c.cust_id = b.cust_id
LEFT JOIN individual i ON c.cust_id = i.cust_id
GROUP BY c.cust_id, b.name, CONCAT(i.fname, ' ', i.lname);
-- 14) (2 Punkte) Selektieren Sie den Namen des Kunden mit dem höchsten Gesamtvermögen (nur eine Gesamt-Query - Subqueries dürfen genutzt werden)
SELECT SUM(a.avail_balance) AS "Gesamtvermögen", COALESCE(
b.name, CONCAT(i.fname, ' ', i.lname)
) AS Kundenname
FROM
customer c
JOIN account a ON c.cust_id = a.cust_id
LEFT JOIN individual i ON c.cust_id = i.cust_id
LEFT JOIN business b ON c.cust_id = b.cust_id
GROUP BY
c.cust_id,
b.name,
i.fname,
i.lname
ORDER BY SUM(a.avail_balance) DESC
LIMIT 1;
-- 15) (2 Punkte) Selektieren Sie alle Namen der Bank-Produkte (Tabelle product, Verbindung product_cd)
-- mit den Accounts (account_id), die auf diesem Produkt basieren.
-- Dabei sollen alle Produkte auftauchen, auch die ohne Account.
SELECT p.name AS Produktname,
STRING_AGG(a.account_id::text, ', ') AS Accounts
FROM product p
LEFT JOIN account a ON p.product_cd = a.product_cd
GROUP BY p.product_cd;