PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Fonction dans PostgreSQL pour insérer d'une table à l'autre ?

Vous pouvez résoudre ce problème en SQL pur, vous n'avez pas besoin d'une fonction pour cela.

La meilleure chose à faire est de diviser la collecte de statistiques en deux requêtes distinctes, une pour quand l'équipe joue à domicile, une quand elle joue à l'extérieur. Pour chaque match, calculez les points et les buts marqués. Puis UNION ces deux requêtes et utilisez-les comme sous-requête pour calculer les statistiques globales :

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;

Ce n'est pas particulièrement rapide en raison du CASE instructions, mais ce sera plus rapide que d'utiliser une procédure et une boucle.

Au lieu de mettre le résultat de cette requête dans un tableau, je suggérerais que vous CREATE VIEW general AS ... avec la requête ci-dessus. Dans ce cas, vous obtenez toujours les derniers résultats lorsque vous SELECT * FROM general et vous n'avez pas à TRUNCATE la table générale avant d'exécuter la requête (l'ajout de nouveaux résultats avec des données dans la table violera la contrainte PK). Si vous avez vraiment besoin de la table, utilisez SELECT ... INTO general FROM ... dans la requête ci-dessus.