2016-07-11 4 views
-3

У меня есть две таблицы. Первая таблица (класс) - это таблица, в которой есть классы, которые может выбрать студент, а последний столбец (numberOfRegistration) - это номер регистрации для каждого класса. Вот первая таблица:Как подсчитать количество ROWS в таблице SQL

idClass int; 
name varchar(50); 
date varchar(50); 
state bit; 
description nvarchar(50); 
numberOfRegistration int 

Вторая таблица (регистрации) для регистрации:

idRegistration int; 
dateOfRegistration date; 
name varchar(50); 
lastName varchar(50); 
city nvarchar(50); 
adress nvarchar(50); 
postalNumber int; 
idClass int - this is foreign key, references idClass from Class table ; 

Кто-нибудь есть идеи, как получить номер регистрации для каждого класса в таблице регистрации, и написать, что данных в последний столбец (numberOfRegistration) в классе таблицы.

Спасибо

+4

Это похоже на плохой дизайн базы данных. Не сохраняйте значения, которые легко вычисляются. В этом случае 'select idClass, count (*) из группы регистрации idClass' даст вам количество регистраций для каждого класса. –

+0

Хорошо. Мне нужно заполнить gridview следующими данными: –

+0

Ok. Мне нужно заполнить gridview следующими данными: classname, numberOfRegistration. Моя идея состояла в том, чтобы объединить данные из таблицы классов и count (*) из регистрационной таблицы и представить ее в gridview. Я попробовал этот запрос: SELECT name, COUNT (idRegistration) FROM Class LEFT JOIN Регистрация ON class.idClass = registration.idClass GROUP BY idClass, но я получил эту ошибку: Столбец 'class.name' недопустим в списке выбора, потому что это не содержащихся ни в агрегатной функции, ни в предложении GROUP BY. Не могли бы вы проверить, что я делаю неправильно. Спасибо –

ответ

-1

Вы можете использовать приведенный ниже запрос:

select idClass, count(*) as [NumberOfRegitsration PerClass] 
from Registration 
group by idClass 
+0

выберите idClass, count (*) as [NumberOfRegitsration PerClass] от регистрации группа от idClass - я только пропустил имя из таблицы Class. Как я могу объединиться вместе с этими данными. –

+0

Для этого см ниже запроса:. выберите C.id, C.name, г [NumberOfRegitsration PerClass] из класса C оставил присоединиться ( выберите idClass, граф (*), как [NumberOfRegitsration PerClass] от регистрации группы idClass) R на c.idclass = r.idclass – abssab

+0

работает просто отлично. спасибо –

1

Попробуйте это:

UPDATE c 
SET numberOfRegistration = COUNT(0) 
FROM Class c 
LEFT JOIN Registration r ON r.idClass = c.idClass 
GROUP BY r.IdClass; 
0

Вы можете использовать производную таблицу, чтобы объединить группу по результатам с таблицей класса , например:

SELECT name, NumberOfRegistrations 
FROM Class 
LEFT JOIN 
(
    SELECT idClass, count(*), NumberOfRegistrations 
    FROM Registration 
    GROUP BY idClass 
) D ON class.idClass = D .idClass 
+0

спасибо за это. –

0

Вы можете подумать о создании двух шагов для полного решения. Первый шаг - обновление таблицы классов с текущими значениями в качестве отправной точки. Как второй шаг, вы можете создать триггер SQL, чтобы сохранить регистрацию отсчитывает до настоящего времени для соответствующего класса

Вот скрипт обновления для первого шага

update class 
set numberOfRegistration = cnt 
from class c 
left join (
    select r.idClass, COUNT(r.idRegistration) cnt 
    from class c 
    left join Registration r on c.idClass = r.idClass 
    group by r.idClass 
) t on c.idClass = t.idClass 

И это код триггера SQL. Я создал sample SQL trigger как после вставки, обновления, удаления триггера, как показано на рисунке код

Create TRIGGER dbo.Registration_changes 
ON dbo.Registration 
AFTER INSERT, UPDATE, DELETE 
AS 

WITH CTE AS (
    select idClass from inserted 
    union all 
    select idClass from deleted 
), cte2 as (
    select CTE.idClass, COUNT(r.idRegistration) cnt 
    from cte 
    left join Registration r on CTE.idClass = r.idClass 
    Group By CTE.idClass 
) 
update Class 
set numberOfRegistration = cte2.cnt 
from cte2 
where class.idClass = cte2.idClass 

GO 

Я надеюсь, что это помогает,

+0

отлично. Спасибо. попробуем. –