sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Función en PostgreSQL para insertar de una tabla a otra?

Puede resolver este problema en SQL puro, no necesita una función para esto.

Lo mejor es dividir la recopilación de estadísticas en dos consultas distintas, una para cuando el equipo juega en casa y otra cuando juega fuera. Para cada partido calcula los puntos y los goles marcados. Entonces UNION esas dos consultas y utilícelas como una subconsulta para calcular las estadísticas generales:

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;

Esto no es particularmente rápido debido al CASE declaraciones, pero será más rápido que usar un procedimiento y un bucle.

En lugar de poner el resultado de esta consulta en una tabla, le sugiero que CREATE VIEW general AS ... con la consulta anterior. En ese caso, siempre obtendrá los últimos resultados cuando SELECT * FROM general y no tienes que TRUNCATE la tabla general antes de ejecutar la consulta (agregar nuevos resultados con datos en la tabla violará la restricción PK). Si realmente necesita la tabla, use SELECT ... INTO general FROM ... en la consulta anterior.