2013-02-26 2 views
3

Я нашел несколько операторов, которые в основном используют разные аргументы для подсчета. Мой вопрос: как мне объединить результаты в одном утверждении, чтобы эти подсчеты могли стать столбцами?Возможный SQL-вложенный запрос?

  1. выберите отсчет (*) в качестве c1 из table1, где город =
  2. выберите отсчет 'NYC' (*), как c2 из table1, где город =
  3. выберите отсчет 'Бостонский' (*), как c3 от table1 где город = 'SF'
+0

возможно дубликат [Count записей в MySQL таблицы в разных колонках в зависимости от различных значений столбца] (http://stackoverflow.com/q/8788133/) – outis

ответ

5
SELECT 
    COUNT(CASE WHEN city = 'nyc' THEN 1 END) AS Nyc, 
    COUNT(CASE WHEN city = 'boston' THEN 1 END) AS Boston, 
    COUNT(CASE WHEN city = 'sf' THEN 1 END) AS Sf 
FROM table 
+0

Спасибо, Майкл. Что делать, если оператор where имеет несколько условий, например city = 'nyc' и gender = 'male'? – Yang

+0

Если у вас несколько условий, вам лучше использовать результаты на основе строк и группировать их. – EkoostikMartin

+1

@Yang Если у вас есть несколько условий, вы можете просто добавить их в свой 'case' ...' WHEN city = 'nyc' AND gender = 'male' THEN 1 END) AS nycMale' –

2

Использование sum(), а также filtering only required cities

select sum(case when city = 'nyc' then 1 end) c1, 
     sum(case when city = 'boston' then 1 end) c2, 
     sum(case when city = 'sf' then 1 end) c3 
from table1 
where city in ('nyc','boston','sf') 
+0

Спасибо, sum() также кажется работа – Yang

+0

Нет проблем, вы можете добавить дополнительные условия для случая, например: (случай, когда city = 'nyc' и gender = 'male', затем 1 конец) и т. д. – Kaf

2
select count(CASE WHEN city = 'nyc' THEN 1 END) as c1, 
     count(CASE WHEN city = 'boston' THEN 1 END) as c2,  
     count(CASE WHEN city = 'sf' THEN 1 END) as c3 
from table1 

Демо на SQLFiddle

Также в SQLServer2005 +, Oracle можно использовать PIVOT операции

SELECT * 
FROM table1 
PIVOT (
COUNT(city) FOR city IN ([nyc], [boston], [sf]) 
) p 

Демонстрация на SQLFiddle

+1

Сводка работает примерно так же в Oracle [demo] (http://sqlfiddle.com/#!4/05497/13) –

+0

@Conrad Frix Спасибо за разъяснения и демонстрацию! –

1

для полноты)

select 
    (select count(*) as c1 from table1 where city = 'nyc') as c1, 
    (select count(*) as c2 from table1 where city = 'boston') as c2, 
    (select count(*) as c3 from table1 where city = 'sf') as c3 
2

Вы можете дать GROUP BY шанс,

SELECT city, gender, count(*) 
WHERE gender = "male" 
GROUP BY city, gender; 
Смежные вопросы