2017-10-23 1 views
0

Ich habe 4 Zeilen in einer Tabelle: SpielerSQL-Abfrage Hilfe verschachtelt und Abfrage der Anzahl

PlayerName (8 distinct players) 
Performance 
    good 
    bad 
Salary (integer) 
PositionPlayed (5 distinct positions) 

ich eine Ausgabe zu erhalten suchen, wo es die Namen der Spieler zeigt und die Anzahl der Anzahl, wie oft der Spieler gespielt in einer bestimmten Position, wenn die Leistung schlecht ist.

  James | Kobe | Jordan 
Center 5 | 8 | 5 
PF  3 | 5 | 2 
PG  2 | 1 | 0 

Ich bin neu in SQL und ich weiß nicht einmal, wo ich anfangen soll für so etwas. Bitte unterstützen oder eine Anleitung geben, wie auf suchen, was ich brauche für diese Art der Abfrage

Dank

+0

Bitte teilen Sie Beispieldaten aus 'Spieler' Tabelle. – zarruq

+0

Ist die zweite Tabelle die gewünschte Ausgabetabelle? Da dies eine zusätzliche Transformation in der PlayerName Spalte erfordert (was sind die 8 Spieler Namen?) – QHarr

+0

ja die zweite Tabelle ist die gewünschte Ausgabe. – IronBat

Antwort

0

Wenn du mit „Spiegeln“ leben können, lernen, wie die Tabelle zu entnehmen ist, wird diese Produktion davon ermöglichen blätterte Layout:

SELECT 
     PlayerName 
     , COUNT(CASE WHEN PositionPlayed = 'Center' THEN PlayerName END) AS "Center" 
     , COUNT(CASE WHEN PositionPlayed = 'PF'  THEN PlayerName END) AS "PF" 
     , COUNT(CASE WHEN PositionPlayed = 'PG'  THEN PlayerName END) AS "PG" 
FROM Players 
WHERE Performance = 'bad' 
GROUP BY PlayerName 
ORDER BY PlayerName 

Es erfordert eine Reihe von dieser für jede Position SQL-Code, aber Sie können so viele Spieler berichten, wie Sie möchten, ohne dass die Abfrage zu ändern.

Sie können diese Logik erweitern, zum Beispiel indem Sie einige Spalten für "gut" und andere für "schlecht", z.

SELECT 
     PlayerName 
     , COUNT(CASE WHEN Performance = 'good' and PositionPlayed = 'Center' THEN PlayerName END) AS "Center" 
     , COUNT(CASE WHEN Performance = 'good' and PositionPlayed = 'PF'  THEN PlayerName END) AS "PF" 
     , COUNT(CASE WHEN Performance = 'good' and PositionPlayed = 'PG'  THEN PlayerName END) AS "PG" 

     , COUNT(CASE WHEN Performance = 'bad' and PositionPlayed = 'Center' THEN PlayerName END) AS "Center" 
     , COUNT(CASE WHEN Performance = 'bad' and PositionPlayed = 'PF'  THEN PlayerName END) AS "PF" 
     , COUNT(CASE WHEN Performance = 'bad' and PositionPlayed = 'PG'  THEN PlayerName END) AS "PG" 
FROM Players 
GROUP BY PlayerName 
ORDER BY PlayerName 
; 
0

Angenommen, Sie Tabellenstruktur so sein -

Create table player(
id int(11) not null auto_increment, 
player_name varchar(20) not null, 
performance varchar(4) not null, 
position_played varchar(2) not null, 
constraint primary key (id) 
); 

Und einige Beispieldaten wie haben -

insert into player(player_name, performance, position_played) 
values('a', 'good', 'p1'), 
     ('a', 'bad', 'p3'), 
     ('a', 'bad', 'p3'), 
     ('b', 'good', 'p2'), 
     ('b', 'bad', 'p2'), 
     ('b', 'good', 'p1'), 
     ('c', 'bad', 'p1'), 
     ('c', 'bad', 'p2'), 
     ('c', 'good', 'p3'); 

Ihre gewünschte Ausgabe dieses generieren wird durch Ausführen von Abfrage-

SELECT P.`position_played`, 
COUNT(
    CASE 
     WHEN P.`performance`='bad' and p.`player_name`='a' 
     THEN p.player_name 
     ELSE NULL 
    END 
) AS 'Player A', 
COUNT(
    CASE 
     WHEN P.`performance`='bad' and p.`player_name`='b' 
     THEN p.player_name 
     ELSE NULL 
    END 
) AS 'Player B', 
COUNT(
    CASE 
     WHEN P.`performance`='bad' and p.`player_name`='c' 
     THEN p.player_name 
     ELSE NULL 
    END 
) AS 'Player C' 
FROM player P 
GROUP BY P.`position_played`; 

Finden Sie ou tput Ergebnis here

+0

Und für jeden neuen Spieler würden Sie eine andere Spalte hinzufügen, und eine andere, und eine andere, bis Sie schwindlig werden oder MySQL gibt auf. –