sql >> データベース >  >> RDS >> PostgreSQL

あるテーブルから別のテーブルに挿入するPostgreSQLの関数?

    この問題は純粋なSQLで解決できますが、このための関数は必要ありません。

    最良の方法は、統計の収集を2つの異なるクエリに分割することです。1つはチームが自宅でプレーするとき、もう1つは離れてプレーするときです。ゲームごとに、得点と得点を計算します。次にUNION これらの2つのクエリをサブクエリとして使用して、全体的な統計を計算します。

    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;
    

    CASEのため、これは特に高速ではありません ステートメントですが、プロシージャとループを使用するよりも高速です。

    このクエリの結果をテーブルに入れる代わりに、CREATE VIEW general AS ...をお勧めします。 上記のクエリで。その場合、SELECT * FROM generalを実行すると、常に最新の結果が得られます。 TRUNCATEする必要はありません クエリを実行する前の一般的なテーブル(テーブル内のデータを使用して新しい結果を追加すると、PK制約に違反します)。テーブルが本当に必要な場合は、SELECT ... INTO general FROM ...を使用してください。 上記のクエリで。




    1. MySql.Data.MySqlClient.MySqlException:「ホストローカルホストはSSL接続をサポートしていません。」

    2. nから始まるmySQLのn番目ごとの行を選択する方法

    3. ASP.net4.0エンティティデータモデルMysqlがMysql列挙体を正しく処理しない

    4. 単一のSQLクエリで、クエリは単一のテーブルからいくつのインデックスを使用できますか?