2012-04-07 4 views
2

Таблица базы данных содержит действия цели.Группа по двум столбцам

type  goal  assist 
goal  Johnny James 
goal  Johnny James 
goal  James  Bob 

При использовании GROUP BY цели, помощь отображает

player goals  assists 
Johnny 2   0 
Johnny 0   0 
James  1   0 
James  0   2 
Bob  0   0 
Bob  0   1 

, но мне это нужно, чтобы показать цели и помогает игроков в одной строке. Приветствия.

+1

Можете ли вы показать запрос, который приведет к этому результату? –

+1

Почему бы не обернуть то, что у вас есть в другом запросе, который использует 'select player, sum (goal), sum (помогает) от () группы от игрока'? Тем не менее, вам нужно показать свой оригинальный запрос ... 'group by player' должно быть все, что вам нужно для оригинала – vol7ron

ответ

3

Вы можете сделать это так (хотя это может быть не самый быстрый запрос, в зависимости от размера базы данных и индексов!):

SELECT players.player, 
     -- Use correlated subselects to count goals/assists 
     (SELECT COUNT(*) FROM actions WHERE goal = players.player) goals 
     (SELECT COUNT(*) FROM actions WHERE assist = players.player) assists 

-- Get all distinct players (UNION = DISTINCT, here). Of course, if you 
-- have an actual players table, use that one instead! 
FROM (
    SELECT goal player FROM actions UNION 
    SELECT assist  FROM actions 
) players 

Из Вашего вопроса, я не уверен, если type = goal имеет отношение к вашему запросу ...

1

возможным решением будет первым UNPIVOT имена игроков, а затем группу поворота:

SELECT 
    Player, 
    COUNT(NULLIF(ScoreType, 'assist')) AS goals, 
    COUNT(NULLIF(ScoreType, 'goal')) AS assists 
FROM (
    SELECT 
    CASE s.ScoreType WHEN 'goal' THEN goal ELSE assist END AS Player, 
    s.ScoreType 
    FROM GoalActions 
    CROSS JOIN (
    SELECT 'goal' AS ScoreType 
    UNION ALL SELECT 'assist' 
) st 
) s 
GROUP BY 
    Player 

Unpivoting я с помощью перекрестного соединения с виртуальной таблицей, а группировка/поворот реализуется в виде агрегации с CASE.

Смежные вопросы