Подсчет значений в столбцах - PullRequest
2 голосов
/ 18 ноября 2009

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

Данные в таблице A

Поля:

Name    Type  
 Bob    1  
 John   2 
 Bob    1 
 Steve  1 
 John   1 
 Bob    2

Желаемый результат запроса:

Name   Type 1  Type 2
Bob    2       1
John   1       1
Steve  1       0

Ответы [ 5 ]

7 голосов
/ 18 ноября 2009

Это сделает свое дело в SQL Server:

SELECT
  name,
  SUM( CASE type WHEN 1 THEN 1 ELSE 0 END) AS type1,
  SUM( CASE type WHEN 2 THEN 1 ELSE 0 END) AS type2
FROM
  myTable
GROUP BY
  name
2 голосов
/ 18 ноября 2009

Нет времени на написание кода, но вы должны здесь указать оператор Case. Просто имейте значение 1, если оно соответствует случаю, и ноль, если оно не соответствует. Затем вы можете суммировать столбцы.

0 голосов
/ 18 ноября 2009

Вы ищете решение CrossTab. Вышеуказанные решения будут работать, но вы отклеитесь, если вам нужно общее решение и N типов.

Решение CrossTab решит это за вас. Если это для быстрого подсчета некоторых чисел, поместите свои данные в Excel и используйте встроенную функцию сводной таблицы.

Если это для RDBMS в приложении, то это зависит от RDBMS. MS SQL 2005 и выше имеет синтаксис кросс-таблицы. См:

http://www.databasejournal.com/features/mssql/article.php/3521101/Cross-Tab-reports-in-SQL-Server-2005.htm

0 голосов
/ 18 ноября 2009

Используйте два отдельных подзапроса GROUP BY.

SELECT Name, a.Count1, b.Count2
from myTable
JOIN
  (SELECT Name, SUM(Type) AS Count1 FROM myTable GROUP BY Name WHERE Type=1) AS a ON a.Name = myTable.Name
  (SELECT Name, SUM(Type) FROM myTable GROUP BY Name WHERE Type=2) AS b ON b.Name = myTable.Name
0 голосов
/ 18 ноября 2009

@ Seb имеет хорошее решение, но оно зависит от сервера. Вот альтернативное использование подвыборов, которые должны быть переносимыми:

select
  name,
  (select count(type) from myTable where type=1 and name=a.name) as type1,
  (select count(type) from myTable where type=2 and name=a.name) as type2
from
  myTable as a
group by 
  name
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...