PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Funzione in PostgreSQL per inserire da una tabella all'altra?

Puoi risolvere questo problema in puro SQL, non hai bisogno di una funzione per questo.

La cosa migliore è suddividere la raccolta delle statistiche in due query distinte, una per quando la squadra gioca in casa, l'altra quando gioca in trasferta. Per ogni partita calcola i punti ei goal segnati. Quindi UNION queste due query e usala come sottoquery per calcolare le statistiche complessive:

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;

Questo non è particolarmente veloce a causa del CASE istruzioni, ma sarà più veloce rispetto all'utilizzo di una procedura e di un ciclo.

Invece di inserire il risultato di questa query in una tabella, ti suggerirei di CREATE VIEW general AS ... con la domanda di cui sopra. In tal caso ottieni sempre gli ultimi risultati quando SELECT * FROM general e non devi TRUNCATE la tabella generale prima di eseguire la query (l'aggiunta di nuovi risultati con i dati nella tabella violerà il vincolo PK). Se hai davvero bisogno della tabella, usa SELECT ... INTO general FROM ... nella query precedente.