2017-03-04 3 views
0

ich zur Zeit zwei Tabellen in meiner Datenbank habe:Datenbank-Design für die jährlichen Zahlungen

  • "Kunden" mit den Spalten: customer_id, customer_name
  • "Zahlungen" mit den Spalten: payment_id, customer_id, Jahr, bezahlt (bool), payer

Die Spalte "Jahr" gibt das Jahr an, für das der "Zahler" bezahlt hat.

Das gibt mir nur eine bezahlte Säule:

SELECT customer_id, paid AS paid_for_2017 FROM customers LEFT JOIN payments ON customers.customer_id=payments.customer_id AND year=2017; 

Jetzt brauche ich eine SELECT-Abfrage, die mir folgendes ergibt:

customer_name, paid_for_2017, paid_for_2018,... 

Wie das ich tun? Sollte ich mein Datenbankdesign ändern? Vorschläge sind willkommen.

Antwort

2

Wenn Sie die Jahre kennen, können Sie nur bedingte Aggregation verwenden:

SELECT customer_id, 
     SUM(CASE WHEN year = 2017 THEN paid END) AS paid_for_2017, 
     SUM(CASE WHEN year = 2018 THEN paid END) AS paid_for_2018 
FROM customers c LEFT JOIN 
    payments p 
    ON c.customer_id = p.customer_id 
GROUP BY customer_id;