2013-02-27 3 views
0

нужны предложения по запросе MS SQL:SQL запросов: Получить количество подсчета

стол: студенты

id name class 
-- ---- ----- 
1 John Math, Biology 
2 Jane English 
3 Mark Math 

стол: класс

id name 
-- ---- 
1 Math 
2 English 
3 Biology 
4 History 

Желаемая выход

name  count 
----  ----- 
Math  2 
English  1 
Biology  1 
History  0 
+0

Так у вас есть строковый столбец с именем 'class' и в нем вы должны анализировать список запятой, чтобы получить имена классов?Я заметил, что в вашем примере «Наука» не появляется нигде, кроме таблицы «Студенты». Это ошибка, или вы действительно не знаете, что это значит? –

+0

@EliGassert фиксированный –

ответ

1

Вот ответ на SQL Server:

SELECT c.name, COUNT(b.id) as `totalCount` 
FROM class c LEFT JOIN 
    students s 
    ON ','+s.class+',' like '%,'+a.name+',%' 
GROUP BY c.name 

На самом деле, это не работает а также пробелы, которые у вас есть в именах классов. Попробуйте on вместо:

 ON ','+replace(s.class, ' ', '')+',' like '%,'+replace(a.name, ' ', '')+',%' 
+0

Мне пришлось использовать это: ON s.class, как '%' + a.name + '%' –

+0

@FlipBooth. , , Это работает. Пока у вас нет имени класса «Английский», а другое - «Английская литература». –

2

Это для MySQL.

SELECT a.name, COUNT(b.id) as `totalCount` 
FROM class a 
     LEFT JOIN students b 
      ON FIND_IN_SET(a.name, b.class) > 0 
GROUP BY a.name 

для лучшей производительности, нормализуют таблицы такие, создавая 3 таблицы,

студентов

  • ID (ПК)
  • Имя

Класс

  • ID (ПК)
  • Имя

StudentClass

  • StudentID (ФК)
  • ClassID (FK)

Это является many-to-many отношения, так как студенты могут иметь много классов, а классы имеют также много студентов.

И запрос должен выглядеть так,

SELECT a.Name, COUNT(b.ClassID) totalCount 
FROM Class a 
     LEFT JOIN StudentClass b 
      ON a.id = b.ClassID 
GROUP BY a.Name 
+0

+1 для предложения нормализации. – Sablefoste

+0

@JW find_in_set не является признанным встроенным именем функции .. Im using MS SQL –

+0

@Sable Foste ... У меня нет контроля над БД –

1
select 
class.name as name, 
count(*) as count 
from students, class 
where students.class like '%'+class.name+'%' 
+0

Это не сработает, потому что он не будет возвращать классы со счетом 0 –

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