Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Группировка данных [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


Наверх

Титульная страница Поиск, карта сайта Написать письмо