SQL Group по одному столбцу, количество записей в другом - PullRequest
4 голосов
/ 26 июня 2011

Я использую базу данных sqlite3 с такой таблицей.

|name   |action     |
-------------------------
|john   |run        |
|jim    |run        |
|john   |run        |
|john   |jump       |
|jim    |jump       |
|jim    |jump       |
|jim    |dive       |

Я хочу получить такой вывод

|name   |run    |jump   |dive   |
---------------------------------
|john   |2  |1  |0  |
|jim    |1  |2  |1  |

Самое близкое, что я получил, это с этим, но я хотел бы иметь один ряд, как указано выше.

SELECT name, action, COUNT(name)
FROM table
GROUP BY name, action

|name   |action |COUNT(name)    |
|john   |run    |2      |
|john   |jump   |1      |
|jim    |run    |1      |
|jim    |jump   |2      |
|jim    |dive   |1      |

Кроме того, мне также понадобятся операторы WHERE в запросе.

Я не сплю ночью, думая, что это сработает?

Ответы [ 4 ]

2 голосов
/ 26 июня 2011

Вы также можете выполнить то, что хотите, используя агрегирование суммы и условия CASE, например:

SELECT name, 
       sum(CASE WHEN action = 'run' THEN 1 END) as run,
       sum(CASE WHEN action = 'jump' THEN 1 END) as jump,
       sum(CASE WHEN action = 'dive' THEN 1 END) as dive
FROM table
GROUP BY name

Вам все равно придется изменять запрос при каждом добавлении дополнительных действий.

1 голос
/ 27 июня 2011

в базе данных Oracle вы можете написать, как показано ниже, чтобы показать требуемое решение: -

select * from table_name
pivot (count(*) for action in ('run','jump','drive'))

это даст желаемый результат ..

1 голос
/ 26 июня 2011

То, что вы пытаетесь сделать, называется кросс-табуляция . Обычно это доступно как функция, называемая сводной таблицей в Excel и других программах для работы с электронными таблицами.

Я нашел статью в блоге, которая поможет вам в этом с помощью SQL. Проверьте сводная таблица взломать в sqlite3-и-MySQL

1 голос
/ 26 июня 2011

Я не очень хорошо знаю SQLLite, но я представляю, что вы можете использовать подзапросы или временные таблицы. С помощью mssql вы можете написать что-то вроде этого:

select Name, 
     (select count(*) from table as t1 where t1.Name = table.Name and t1.Action = 'run') as Run, 
(select count(*) from table as t1 where t1.Name = table.Name and t1.Action = 'dive') as dive, 
(select count(*) from table as t1 where t1.Name = table.Name and t1.Action = 'jump') as run
 from table 

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

...