![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Группировка данных [D6, IB5.x]
Dush © (2003-09-01 10:43:00)
Имеется структура таблицы:
Propusk
Id_Propusk
ID_Stud
Prichina (либо 0 либо 1)
...
Возможно ли сделать групировку данных так чтобы в результирующем НД каждая запись представлялась бы так:
ID_Stud Prichina_0 Prichina_1
(в столбце Prichina_0 - количество записей со значением Prichina=0; в столбце Prichina_1 - количество записей со значением Prichina=1)
Dush (2003-09-02 09:58:00) [1]
2 HSolo ©
мда, действительно :)))
Как говорилось в одном фильме: "Я не подумал..." :)))
Спасибо большое, а то проект уже надо было сдать, а я как обычно все в последний день :(
HSolo (2003-09-02 08:55:00) [2]
Естественно, не будешь :)) Только Вы номер студента, по-моему, дважды выводите: Stud.ID_Stud и Propusk.ID_Stud. Оно, конечно, мелочь - но зачем?
Dush (2003-09-01 19:23:00) [3]
2 HSolo ©
1. Получилось :))))) Спасибо большое.
2. Ну в гриде же не будешь показывать для декана факультета номера студентов в базе.
HSolo (2003-09-01 17:27:00) [4]
1. В Group by пропущено поле Stud.ID_Stud
2. А зачем вообще его выводить, если есть Propusk.ID_Stud?
Dush (2003-09-01 16:35:00) [5]
2 HSolo ©
Вот он код!
SELECT Stud.Familiya, Stud.ID_Stud, (select count(*) from Propusk where Propusk.ID_Stud = Stud.ID_Stud and Propusk.Prichina="Уважительная") as Prichina_0, (select count(*) from Propusk where Propusk.ID_Stud = Stud.ID_Stud and Propusk.Prichina="Не уважительная") as Prichina_1, Propusk.ID_Stud
FROM STUD Stud
INNER JOIN PROPUSK Propusk
ON (Propusk.ID_STUD = Stud.ID_STUD)
where Propusk.id_stud in (Select Stud.ID_STUD from Stud where stud.ID_Group=(select Groups.ID_Group from GROUPS Groups where Groups.Name=:GroupName))
GROUP BY Stud.Familiya, Propusk.ID_Stud
Вот структура таблиц:
Groups Stud Propusk
ID_Group ID_Stud ID_Propusk
Name ID_Group ID_Stud
Familiya Prichina
..... .......
HSolo (2003-09-01 16:03:00) [6]
Давайте полный текст ругающегося запроса.
А, кстати, вот это:
... where Propusk.id_stud in (Select ...
не тормозит? Может, лучше join?
Dush (2003-09-01 15:22:00) [7]
2 Zacho ©
Есть там такое поле, есть!!!
Zacho (2003-09-01 15:04:00) [8]
Значит, в таблице STUD нет поля FAMILIYA
Dush (2003-09-01 15:02:00) [9]
2 HSolo ©
не помогает :(
HSolo (2003-09-01 14:59:00) [10]
Вы не забыли добавить Stud.Familiya в Group by ?
Dush (2003-09-01 14:56:00) [11]
И снова здравствуйте! Проблема вот в чем - сделал запрос такого вида:
SELECT Propusk.ID_Stud, (select count(*) from Propusk where Propusk.ID_Stud = Stud.ID_Stud and Propusk.Prichina="Уважительная") as Prichina_0, (select count(*) from Propusk where Propusk.ID_Stud = Stud.ID_Stud and Propusk.Prichina="Не уважительная") as Prichina_1,
FROM STUD Stud
INNER JOIN PROPUSK Propusk
ON (Propusk.ID_STUD = Stud.ID_STUD)
where Propusk.id_stud in (Select Stud.ID_STUD from Stud where stud.ID_Group=(select Groups.ID_Group from GROUPS Groups where Groups.Name=:GroupName))
GROUP BY Propusk.ID_Stud
Все хорошо работает.
765 1 3
768 2 0
...
А теперь хочу вместо номера студента (ID_Stud) в гриде выводить фамилию. для этого добавляю после Propusk.ID_Stud -Stud.Familiya. При попытке выполнить запрос выдает ошибку:"invalid column references"! C чем это связано?
Соловьев (2003-09-01 11:01:00) [12]
можно и хранимой процедурой.
for
select id_student
from table
into :id_s
do
begin
select count(*)
from table
where is_student = id_s and id_prichina = 0
into :id_p0;
select count(*)
from table
where is_student = id_s and id_prichina = 1
into :id_p1;
suspend;
end
...
asp (2003-09-01 11:00:00) [13]
SELECT T.ID_STUD, COUNT(T0.PRICHINA) AS PRICHINA_0, COUNT(T1.PRICHINA) AS PRICHINA_1
FROM TABLE T
LEFT OUTER JOIN TABLE T0 ON (T0.ID_PROPUSK = T.ID_PROPUSK AND T0.PRICHINA = 0)
LEFT OUTER JOIN TABLE T1 ON (T1.ID_PROPUSK = T.ID_PROPUSK AND T1.PRICHINA = 1)
GROUP BY T.ID_STUD
Dush (2003-09-01 10:59:00) [14]
Спасибо
stone (2003-09-01 10:53:00) [15]
вероятно здесь потребуются вложенные запросы:
select t.ID_Stud, (select count(*) from Propusk where ID_Stud = t.ID_Stud and Prichina=0) as Prichina_0, (select count(*) from Propusk where ID_Stud = t.ID_Stud and Prichina=1) as Prichina_1 from Propusk t GROUP BY t.ID_Stud
Zacho (2003-09-01 10:51:00) [16]
Можно. Например, так:
SELECT P.ID_STUD, (SELECT COUNT(P1.PRICHINA) FROM PROPUSK P1 WHERE P1.ID_STUD=P.ID_STUD AND P1.PRICHINA=0 ) AS PRICHINA_0, (SELECT COUNT(P2.PRICHINA) FROM PROPUSK P2 WHERE P2.ID_STUD=P.ID_STUD AND P1.PRICHINA=1) AS PRICHINA_1 FROM PROPUSK P
HSolo (2003-09-01 10:49:00) [17]
select t.id_stud,
(select count(to.prichina) from propusk t0
where t0.id_stud = t.id_stud
and t0.prichina = 0),
(select count(to.prichina) from propusk t1
where t1.id_stud = t.id_stud
and t1.prichina = 1)
from prichina t