PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Funktion in PostgreSQL zum Einfügen von einer Tabelle in eine andere?

Sie können dieses Problem in reinem SQL lösen, Sie brauchen dafür keine Funktion.

Das Beste ist, die Sammlung von Statistiken in zwei unterschiedliche Abfragen aufzuteilen, eine für das Heimspiel der Mannschaft und eine für das Auswärtsspiel. Berechnen Sie für jedes Spiel die Punkte und die erzielten Tore. Dann UNION diese beiden Abfragen und verwenden Sie diese als Unterabfrage, um die Gesamtstatistik zu berechnen:

SELECT
  eq.nom_equipo AS equipo,
  COUNT(p.*) AS partidos_jug,
  SUM(CASE WHEN p.puntos = 3 THEN 1 ELSE 0 END) partidos_gana,
  SUM(CASE WHEN p.puntos = 1 THEN 1 ELSE 0 END) partidos_emp,
  SUM(CASE WHEN p.puntos = 0 THEN 1 ELSE 0 END) partidos_perd,
  SUM(p.puntos) AS puntos,
  SUM(p.goles) AS goles_favor
FROM equipos eq
JOIN (
  -- Playing at home
  SELECT
    num_eqpo_loc AS eqpo, 
    CASE WHEN (goles_loc > goles_vis) THEN 3
         WHEN (goles_loc = goles_vis) THEN 1
         ELSE 0
    END AS puntos,
    goles_loc AS goles
  FROM partidos
  UNION
  -- Playing away
  SELECT
    num_eqpo_vis AS eqpo, 
    CASE WHEN (goles_vis > goles_loc) THEN 3
         WHEN (goles_vis = goles_loc) THEN 1
         ELSE 0
    END AS puntos,
    goles_vis AS goles
  FROM partidos) AS p ON p.eqpo = eq.num_eqpo
GROUP BY equipo
ORDER BY puntos DESC, partidos_jug ASC, goles_favor DESC;

Dies ist aufgrund des CASE nicht besonders schnell Anweisungen, aber es ist schneller als die Verwendung einer Prozedur und einer Schleife.

Anstatt das Ergebnis dieser Abfrage in eine Tabelle zu schreiben, würde ich vorschlagen, dass Sie CREATE VIEW general AS ... erstellen mit obiger Abfrage. In diesem Fall erhalten Sie immer die neuesten Ergebnisse, wenn Sie SELECT * FROM general und Sie müssen nicht TRUNCATE die allgemeine Tabelle, bevor Sie die Abfrage ausführen (das Hinzufügen neuer Ergebnisse mit Daten in der Tabelle verstößt gegen die PK-Einschränkung). Wenn Sie die Tabelle wirklich brauchen, verwenden Sie SELECT ... INTO general FROM ... in der Abfrage oben.