-- 1) Selektieren Sie die Employee ID, Vornamen und Nachname aller Angestellten - sortieren Sie absteigend nach Nachname und dann nach Vorname.
select emp_id "Employee ID", fname Vorname, lname Nachname
from employee
order by lname desc, fname;

-- 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 Kontonummer, cust_id Kundennummer, avail_balance Kontostand
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 distinct open_emp_id "ID des Angestellten"
from account;

-- 4) Zählen Sie die Zeilen in der account-Tabelle.
select count(*)
from account;

-- 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.
select individual.fname || ' ' || individual.lname "Name", count(*) "Anzahl Konten"
from customer
join individual on customer.cust_id = individual.cust_id
join account on customer.cust_id = account.cust_id
group by "Name";

-- 6) Wie 5), aber zeigen Sie nur Kunden an, die 2 oder mehr Konten haben.
select individual.fname || ' ' || individual.lname "Name", count(*) "Anzahl Konten"
from customer
join individual on customer.cust_id = individual.cust_id
join account on customer.cust_id = account.cust_id
group by "Name"
having count(*) >= 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
where extract('year' from open_date) = '2002';

-- 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
where individual.lname like '_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 account.account_id "Account-ID", customer.fed_id "fed_id des Kunden", product.name "Name des Produkts"
from account
join customer on customer.cust_id = account.cust_id
join product on product.product_cd = account.product_cd
where customer.cust_type_cd = 'I';

-- 10) Schreiben Sie eine Query, die alle Angestellten findet, deren Supervisor in einer anderen Abteilung (department) arbeitet. Selektieren Sie ID, Vor- und Nachname.
select emp.emp_id "ID", emp.fname "Vorname", emp.lname "Nachname"
from employee emp
join employee sup on sup.emp_id = emp.superior_emp_id
where emp.dept_id != sup.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 "Vorname", lname "Nachname"
from individual
union all
select fname "Vorname", lname "Nachname"
from employee;

-- 12) (2 Punkte) Selektieren Sie folgende Tabelle: Vorgesetzter (Name), komma-getrennte Liste der Mitarbeiter, die zu einem Vorgesetzten gehören (Tipp 1: superior_emp_id, Tipp 2: Recherchieren Sie per Internetsuche oder ChatGPT, wie man in einer Query zweimal dieselbe Tabelle nutzen kann.)
select sup.fname || ' ' || sup.lname "Vorgesetzter", array_agg(emp.fname || ' ' || emp.lname) "Mitarbeiter"
from employee sup
join employee emp on emp.superior_emp_id = sup.emp_id
group by "Vorgesetzter";

-- 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 a.account_id "Account-ID", c.cust_id "Customer-ID", coalesce(b.name, i.fname || ' ' || i.lname) "Name"
from account a
join customer c on c.cust_id = a.cust_id
left join individual i on i.cust_id = c.cust_id
left join business b on b.cust_id = c.cust_id;

-- 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 coalesce(b.name, i.fname || ' ' || i.lname) "Name"
from account a
join customer c on c.cust_id = a.cust_id
left join individual i on i.cust_id = c.cust_id
left join business b on b.cust_id = c.cust_id
order by 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 "Name des Bank-Produkts", array_agg(a.account_id) "Accounts"
from product p
left join account a on a.product_cd = p.product_cd
group by "Name des Bank-Produkts";
