sql >> Database >  >> RDS >> PostgreSQL

Functie in PostgreSQL om van de ene tabel naar de andere in te voegen?

Je kunt dit probleem oplossen in pure SQL, je hebt hier geen functie voor nodig.

Het beste is om de verzameling statistieken op te splitsen in twee afzonderlijke zoekopdrachten, één voor wanneer het team thuis speelt en één wanneer ze uitspelen. Bereken voor elk spel de punten en de gescoorde doelpunten. Dan UNION die twee zoekopdrachten en gebruik die als een subquery om de algemene statistieken te berekenen:

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;

Dit is niet bijzonder snel vanwege de CASE instructies, maar het zal sneller zijn dan het gebruik van een procedure en een lus.

In plaats van het resultaat van deze zoekopdracht in een tabel te plaatsen, raad ik u aan CREATE VIEW general AS ... met bovenstaande vraag. In dat geval krijg je altijd de laatste resultaten als je SELECT * FROM general en je hoeft niet te TRUNCATE de algemene tabel voordat de query wordt uitgevoerd (het toevoegen van nieuwe resultaten met gegevens in de tabel zal de PK-beperking schenden). Als je de tabel echt nodig hebt, gebruik dan SELECT ... INTO general FROM ... in de bovenstaande zoekopdracht.




  1. Fatale fout:Klasse 'TableRows' niet gevonden in

  2. PostgreSQL:mijn database optimaliseren voor het opslaan en doorzoeken van een enorme grafiek

  3. Oracle SQL-datum naar lang en vice versa

  4. het verzenden van bulk-sms stopt in het midden