powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Для заданной дисциплины определить количество оценок
14 сообщений из 14, страница 1 из 1
Для заданной дисциплины определить количество оценок
    #39561270
beholderka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Необходимо сформировать запрос
Для заданной дисциплины определить количество оценок 5, 4, 3 и 2 (абсолютные и относительные значения в %).
Я не могу понять как найти относительное значение. Для этого необходимо кол-во оценок в рамках одного предмета, но из-за группировки оно отдельно считает в каждой строке. Возможно можно как-то подтянуть данные из другого запроса? я не знаю как.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT Srating.rating, COUNT(Srating.rating) AS kol;
 FROM ;
     SESSION!sdis ;
    INNER JOIN SESSION!srating ;
   ON  Sdis.id_dis = Srating.id_dis ;
    INNER JOIN SESSION!sstudents ;
   ON  Sstudents.id_stud = Srating.id_stud;
 GROUP BY Srating.rating, Sdis.discipline;
 HAVING  Sdis.discipline IN (( "Русский" ))
...
Рейтинг: 0 / 0
Для заданной дисциплины определить количество оценок
    #39561274
beholderka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость

Таблицы

Результат который у меня выходит
...
Рейтинг: 0 / 0
Для заданной дисциплины определить количество оценок
    #39561560
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beholderka,
Вам нужно еще одно соединение с аналогичной выборкой, но без группировки по рейтингу
Ну а дальше просто вычисления...
Писано на колене
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SELECT Srating.rating, COUNT(Srating.rating) AS kol,q.qty;
 FROM ;
     SESSION!sdis ;
    INNER JOIN SESSION!srating ;
   ON  Sdis.id_dis = Srating.id_dis ;
    INNER JOIN SESSION!sstudents ;
   ON  Sstudents.id_stud = Srating.id_stud;
INNER JOIN 
(
SELECT Sdis.id_dis, Srating.id_stud,COUNT(*) AS qty;
 FROM ;
     SESSION!sdis ;
    INNER JOIN SESSION!srating ;
   ON  Sdis.id_dis = Srating.id_dis ;
    INNER JOIN SESSION!sstudents ;
   ON  Sstudents.id_stud = Srating.id_stud;
 GROUP BY Sdis.id_dis, Srating.id_stud;
) q on  Sstudents.id_stud = q.id_stud;
 and  q.id_dis = Srating.id_dis ;

 where   Sdis.discipline IN (( "Русский" ))
 GROUP BY Srating.rating, Sdis.discipline;



Да HAVING медленная операция. И здесь не нужна. Where Существенно быстрее.
...
Рейтинг: 0 / 0
Для заданной дисциплины определить количество оценок
    #39561561
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asdor,

Код: sql
1.
2.
 INNER JOIN SESSION!sstudents ;
   ON  Sstudents.id_stud = Srating.id_stud;



во вложенной выборке, видимо лишние
Можа и еще мона улучшить
...
Рейтинг: 0 / 0
Для заданной дисциплины определить количество оценок
    #39562248
beholderka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
asdor,

спасибо, что-то у меня не вышло, чтоб оно заработало
у вас случайно нет ссылки с адекватным примерами таких подзапросов?
...
Рейтинг: 0 / 0
Для заданной дисциплины определить количество оценок
    #39562454
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beholderkaasdor,

спасибо, что-то у меня не вышло, чтоб оно заработало
у вас случайно нет ссылки с адекватным примерами таких подзапросов?

Таким SELECT-ом только детей пугать вместо Бабы-Яги, накрутил вам спец.
Вам по сути нужно только поле rating в одной таблице.
Выполните объединение этой таблицы с самим собой, но с условиями вам придется повозиться.
(И еще - в фоксе INNER и SESSION! по умолчанию).
...
Рейтинг: 0 / 0
Для заданной дисциплины определить количество оценок
    #39562539
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sg12Вам по сути нужно только поле rating в одной таблице.
Выполните объединение этой таблицы с самим собой, но с условиями вам придется повозиться.

Я когда отвечать начал, так же подумал.
Только ей сумма отдельная нужна. Так что...
Покажите как это без подзапроса сделать.
А монструозный... так скопипастил, и подправил)))
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SELECT Srating.rating, COUNT(Srating.rating) AS kol,q.qty;
 FROM ;
     SESSION!sdis ;
    INNER JOIN SESSION!srating ;
   ON  Sdis.id_dis = Srating.id_dis ;
    INNER JOIN SESSION!sstudents ;
   ON  Sstudents.id_stud = Srating.id_stud;
INNER JOIN 
(
SELECT Sdis.id_dis, Srating.id_stud,COUNT(*) AS qty;
 FROM ;
   SESSION!srating ;
 GROUP BY id_dis, id_stud;
) q on  Sstudents.id_stud = q.id_stud;
 and  q.id_dis = Srating.id_dis ;

 where   Sdis.discipline IN (( "Русский" ))
 GROUP BY Srating.rating, Sdis.discipline;


Вот так покороче будет.

А что у вас не получилось, одному богу известно.
Были б тестовые данные, скрипты создания и т.д. можно было б поточнее написать

А примеры, поищите в иенте. Наверняка найдете достаточно литературы. Тока не все в фоксе работает. (я и про этот то не уверен)))
...
Рейтинг: 0 / 0
Для заданной дисциплины определить количество оценок
    #39562541
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asdor,
Отослал, заметил
Код: sql
1.
2.
3.
SELECT Srating.rating, COUNT(Srating.rating) AS kol,Max(q.qty) qty
либо
GROUP BY Srating.rating, Sdis.discipline,q.qty;


Иначе ругаться будет.
...
Рейтинг: 0 / 0
Для заданной дисциплины определить количество оценок
    #39562763
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В Вашей постановке задаче слово "студент" вообще нет. Зачем же Вы все время пытаетесь так или иначе вставить в выборку таблицу студентов? Она вообще лишняя

Абсолютное значение - это общее количество записей
Относительное - это абсолютное значение деленное на сумму всех значений

Задачу можно решить двумя способами

1. Сделать то, что Вы и пытаетесь. Два отдельных запроса: один в разрезе значений, другой по всем значениям (итог), а потом их объединить.

Только обратите внимание, что фильтр по конкретной дисциплине надо добавлять в каждый из этих подзапросов. Т.е. и абсолютное значение и общее должны быть по одной дисциплине.

2. Сделать некий аналог кросс-таблицы. Развернуть строки в столбцы. Поскольку здесь фиксированное количество значений, то это достаточно легко можно сделать. Это будет выглядеть примерно так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select ;
      sum(iif(Srating.rating = 1, 1, 0)) as rating1, ;
      sum(iif(Srating.rating = 2, 1, 0)) as rating2, ;
      sum(iif(Srating.rating = 3, 1, 0)) as rating3, ;
      sum(iif(Srating.rating = 4, 1, 0)) as rating4, ;
      sum(iif(Srating.rating = 5, 1, 0)) as rating5, ;
      count(*) as total
from srating ;
inner join sdis on Sdis.id_dis = Srating.id_dis ;
where Sdis.discipline IN (( "Русский" ))



Можно сразу же и вычислить итоговые значения, используя эту конструкцию как подзапрос, но опять же, в строку

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
select ;
    tmp.rating1, ;
    tmp.rating1/tmp.total*100 as percent1, ;
    tmp.rating2, ;
    tmp.rating2/tmp.total*100 as percent2, ;
    tmp.rating3, ;
    tmp.rating3/tmp.total*100 as percent3, ;
    tmp.rating4, ;
    tmp.rating4/tmp.total*100 as percent4, ;
    tmp.rating5, ;
    tmp.rating5/tmp.total*100 as percent5, ;
from ( ;
      select ;
            sum(iif(Srating.rating = 1, 1, 0)) as rating1, ;
            sum(iif(Srating.rating = 2, 1, 0)) as rating2, ;
            sum(iif(Srating.rating = 3, 1, 0)) as rating3, ;
            sum(iif(Srating.rating = 4, 1, 0)) as rating4, ;
            sum(iif(Srating.rating = 5, 1, 0)) as rating5, ;
            count(*) as total
      from srating ;
      inner join sdis on Sdis.id_dis = Srating.id_dis ;
      where Sdis.discipline IN (( "Русский" )) ;
      ) as tmp
...
Рейтинг: 0 / 0
Для заданной дисциплины определить количество оценок
    #39563231
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beholderka

Если все еще актуально, проверьте:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SET ENGINEBEHAVIOR 70
число = 2

SELECT tab1.rating AS r0,COUNT(tab1.rating) AS c1,NVL(sel2.c2,0) AS c2  ;
	FROM Srating tab1;
	LEFT JOIN (;
	SELECT tab2.rating,COUNT(tab2.rating) AS c2;
	FROM Srating tab2;
	WHERE tab2.id_dis = число ;
	GROUP BY tab2.rating ;
	) sel2 ;
	ON tab1.rating = sel2.rating ;
	GROUP BY tab1.rating;
	ORDER BY tab1.rating
...
Рейтинг: 0 / 0
Для заданной дисциплины определить количество оценок
    #39563323
beholderka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВладимирМ,
Из всех представленных выше вариантов все так или иначе не работает. Даже ваш,оно жалуется на отсутствие скобки, не смотря на то что с ними все ок (точно). Я хочу чтоб оно было в таком формате:
Оценка Абсол Относит
2---------1---------25
3---------0----------0
4---------1----------25
5---------2---------50
Как вы предлагаете, я примерно и так понимала.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT SUM(IIF(Srating.rating=2,1,0)) AS rating2,;
  SUM(IIF(Srating.rating=3,1,0)) AS rating3,;
  SUM(IIF(Srating.rating=4,1,0)) AS rating4,;
  SUM(IIF(Srating.rating=5,1,0)) AS rating5,;
  (SUM(IIF(Srating.rating=2,1,0))/COUNT(Srating.rating)*100) AS percent2,;
  (SUM(IIF(Srating.rating=3,1,0))/COUNT(Srating.rating)*100) AS percent3,;
  (SUM(IIF(Srating.rating=4,1,0))/COUNT(Srating.rating)*100) AS percent4,;
  (SUM(IIF(Srating.rating=5,1,0))/COUNT(Srating.rating)*100) AS percent5;
 FROM ;
     Srating;
 WHERE  Srating.id_dis = ( 1 )
...
Рейтинг: 0 / 0
Для заданной дисциплины определить количество оценок
    #39563446
asdor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beholderka,

А вы не видите отличия? Что вам предлагал ВладимирМ и вашим запросом?
...
Рейтинг: 0 / 0
Для заданной дисциплины определить количество оценок
    #39563578
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asdorbeholderka,

А вы не видите отличия? Что вам предлагал ВладимирМ и вашим запросом?

Вам не угодишь, все вы в трудах.
Может этот запрос вас устроит:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
SET ENGINEBEHAVIOR 70
число = 2

SELECT tab1.rating AS r0,NVL(sel2.c2,0) AS c2,NVL(sel3.c3,0) AS c3,INT(NVL(c2/c3*100,0)) AS p3 ;
	FROM table1 tab1;
	LEFT JOIN (;
	SELECT tab2.rating,COUNT(tab2.rating) AS c2;
	FROM table1 tab2;
	WHERE tab2.id_dis = число ;
	GROUP BY tab2.rating ;
	) sel2 ;
	ON tab1.rating = sel2.rating ;
	INNER JOIN (;
	SELECT tab3.rating,COUNT(tab3.rating) AS c3;
	FROM table1 tab3;
	WHERE tab3.id_dis = число ;
	) sel3 ;
	ON .T. ;
	GROUP BY tab1.rating;
	ORDER BY tab1.rating
...
Рейтинг: 0 / 0
Для заданной дисциплины определить количество оценок
    #39564064
sg12
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
beholderkaВладимирМ,
Из всех представленных выше вариантов все так или иначе не работает. Даже ваш,оно жалуется на отсутствие скобки, не смотря на то что с ними все ок (точно). Я хочу чтоб оно было в таком формате:
Оценка Абсол Относит
2---------1---------25
3---------0----------0
4---------1----------25
5---------2---------50
Как вы предлагаете, я примерно и так понимала.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
SELECT SUM(IIF(Srating.rating=2,1,0)) AS rating2,;
  SUM(IIF(Srating.rating=3,1,0)) AS rating3,;
  SUM(IIF(Srating.rating=4,1,0)) AS rating4,;
  SUM(IIF(Srating.rating=5,1,0)) AS rating5,;
  (SUM(IIF(Srating.rating=2,1,0))/COUNT(Srating.rating)*100) AS percent2,;
  (SUM(IIF(Srating.rating=3,1,0))/COUNT(Srating.rating)*100) AS percent3,;
  (SUM(IIF(Srating.rating=4,1,0))/COUNT(Srating.rating)*100) AS percent4,;
  (SUM(IIF(Srating.rating=5,1,0))/COUNT(Srating.rating)*100) AS percent5;
 FROM ;
     Srating;
 WHERE  Srating.id_dis = ( 1 )



Попробуйте перевести строки в столбцы:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
SET ENGINEBEHAVIOR 70
число = 2

SELECT 2 AS r0,SUM(IIF(rating = 2,1,0)) AS r1,INT(SUM(IIF(rating = 2,1,0))/COUNT(*)*100) AS p1 ;
	FROM table1 ;
	WHERE id_dis = число ;
	UNION ALL ;
	SELECT 3 AS r0,SUM(IIF(rating = 3,1,0)) AS r1,INT(SUM(IIF(rating = 3,1,0))/COUNT(*)*100) AS p1 ;
	FROM table1 ;
	WHERE id_dis = число;
	UNION ALL ;
	SELECT 4 AS r0,SUM(IIF(rating = 4,1,0)) AS r1,INT(SUM(IIF(rating = 4,1,0))/COUNT(*)*100) AS p1 ;
	FROM table1 ;
	WHERE id_dis = число;
	UNION ALL ;
	SELECT 5 AS r0,SUM(IIF(rating = 5,1,0)) AS r1,INT(SUM(IIF(rating = 5,1,0))/COUNT(*)*100) AS p1 ;
	FROM table1 ;
	WHERE id_dis = число
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Для заданной дисциплины определить количество оценок
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]