es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Crear dos tablas virtuales agregadas a partir de una tabla y unir

Quiero construir una consulta basada en una tabla. A partir de esta tabla quiero crear dos tablas virtuales basadas en una consulta de agregación del tipo contar. En mi ejemplo, se dividiría la tabla original en una tabla donde se cuenta la cantidad de juegos de Xbox por jugador y otra donde se cuenta la cantidad de juegos de Playstation por jugador. Luego, los resultados de las consultas se unen en función del PlayerID.

create table data (PlayerID text, game text, platform text);

insert into data (PlayerID, game, platform) values
('Player1', 'Fifa', 'Playstation'),
('Player1', 'Tekken', 'Playstation'),
('Player1', 'Gears of War', 'Xbox'),
('Player1', 'Ninja Gaiden', 'Playstation'),
('Player2', 'Gears of War', 'Xbox'),
('Player1', 'Metal Slug Anthology', 'Playstation'),
('Player1', 'Metal Gear V', 'Playstation'),
('Player2', 'Halo', 'Xbox'),
('Player3', 'Street Fighter', 'Playstation'),
('Player3', 'Madden NFL', 'Playstation'),
('Player1', 'Final Fantasy', 'Xbox'),
('Player2', 'Ratchet & Clank', 'Playstation');

El resultado debería verse así:

| PlayerID | playedPlaystationGames | playedXBoxGames |
|----------|------------------------|-----------------|
|  Player1 |                      5 |               2 |
|  Player2 |                      1 |               2 |
|  Player3 |                      2 |               0 |

Estos 3 pasos se deben hacer en una sola consulta:

Select PlayerID, Count(platform) as playedPlaystationGames, platform
From Data AS TablePlaystation
Group By PlayerID, platform
Having platform='Playstation';

Select PlayerID, Count(platform) as playedXBoxGames, platform
From Data AS TableXBox
Group By PlayerID, platform
Having platform='Xbox';

SELECT data.PlayerID, TableXBox.PlayedXBoxGames, TablePlaystation.playedPlaystationGames
FROM data
RIGHT JOIN (TablePlaystation
    RIGHT JOIN TableXBox
    ON TablePlaystation.PlayerID = TableXBox.PlayerID)
ON TablePlaystation.PlayerID = data.PlayerID;
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para lograr el resultado deseado en una consulta, utilizaríamos subconsultas para crear dos tablas virtuales, una para juegos de Playstation por jugador y otra para juegos de Xbox por jugador, y luego las uniríamos basándonos en la columna PlayerID. A continuación se muestra un ejemplo de consulta que lograría esto:

    SELECT data.PlayerID, TablePlaystation.playedPlaystationGames, TableXBox.playedXBoxGames
    FROM data
    LEFT JOIN (
        SELECT PlayerID, COUNT(game) as playedPlaystationGames
        FROM data
        WHERE platform = 'Playstation'
        GROUP BY PlayerID
    ) AS TablePlaystation
    ON data.PlayerID = TablePlaystation.PlayerID
    LEFT JOIN (
        SELECT PlayerID, COUNT(game) as playedXBoxGames
        FROM data
        WHERE platform = 'Xbox'
        GROUP BY PlayerID
    ) AS TableXBox
    ON data.PlayerID = TableXBox.PlayerID
    GROUP BY data.PlayerID;
    

    En esta consulta, primero seleccionamos la columna PlayerID de la tabla de datos original y la unimos a las dos tablas virtuales creadas por las subconsultas. Las subconsultas cuentan el número de juegos jugados por cada jugador en cada plataforma y los agrupan por PlayerID. El resultado son dos tablas virtuales, una para juegos de Playstation por jugador y otra para juegos de Xbox por jugador.

    Luego unimos estas dos tablas virtuales basándonos en la columna PlayerID y seleccionamos las columnas PlayerID, playedPlaystationGames y playedXBoxGames de la tabla resultante. Finalmente, agrupamos los resultados por PlayerID para eliminar duplicados.

    La tabla resultante debería tener tres columnas: PlayerID, playedPlaystationGames y playedXBoxGames. Cada fila corresponderá a un jugador y mostrará cuántos juegos de Playstation y Xbox han jugado.

Comments are closed.