134 lines
5.2 KiB
SQL
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;
|