powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подзапрос с сортировкой
21 сообщений из 21, страница 1 из 1
Подзапрос с сортировкой
    #39534359
Rphoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте. Изучаю SQL самостоятельно. Придумал задачку. Как её можно реализовать теоретически? Вот такая беда. Допустим, необходимо реализовать отчет в виде таблице. Вертикальном столбике написаны ФИО учеников, а в горизонтальном столбике их оценки. Необходимо на пересечении вывести кол-во оценок.

Лучше будет гнать по SELECT COUNT(*) в каждую ячейку или как-то можно использовать временную таблицу?
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534365
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо дочитать учебник до кляузы GROUP BY и все встанет на свои места.
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534368
Граур Станислав
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если оценок ограниченное количество, например 1,2,3,4,5 то можно еще почитать про iif, case и их использование с count.
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534369
Rphoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_Pisarevsky,
Спасибо, получается, что-то вроде этого? (ФИО человека вертикально, а кол-во карандашей по цветам горизонтально в таблице) ?
SELECT t1.человек ,
(SELECT COUNT(*) FROM table2 as t2 WHERE (t2.type=1)and(t1.человек=t2.человек)) AS 'количество красных',
(SELECT COUNT(*) FROM table2 as t3 WHERE (t3.type=2)and(t1.человек=t3.человек)) AS 'количество синих'
FROM table2 as t1
GROUP BY t1.человек
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534370
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rphoenix,
можно и так, но быстрее будет

Код: sql
1.
2.
3.
4.
5.
6.
SELECT t1."человек",
       sum(iif(t2.type = 1, 1, 0)) "количество красных",
       sum(iif(t2.type = 2, 1, 0)) "количество синих"
FROM table2 t1
join table2 t2 on t1."человек" = t2."человек"
GROUP BY 1
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534372
Rphoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк Евгений,

спасибо! А если нужно не всех людей, а только определенных? Нужна дополнительная таблица?
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534375
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RphoenixНеобходимо на пересечении вывести кол-во оценок.

Код: sql
1.
select fio, ocenka, count(*) from table


А дальше уже знай распихивай числа по пересечениям строки из первого поля со столбцом из
второго. Тривиальная задача в любом языке программирования.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534376
Rphoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк Евгений, пишет Dynamic SQL Error.
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534378
Rphoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RphoenixDimitry Sibiryakov,

то есть создать кучу

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
select count(*) from spisok as s
where s.ocenka=2 and s.fio like 'Иванов'
into :COUNT1;

select count(*) from spisok as s
where s.ocenka=3 and s.fio like 'Иванов'
into :COUNT2;

select count(*) from spisok as s
where s.ocenka=4 and s.fio like 'Иванов'
into :COUNT3;

select count(*) from spisok as s
where s.ocenka=5 and s.fio like 'Иванов'
into :COUNT4;

select count(*) from spisok as s
where s.ocenka=2 and s.fio like 'Петров'
into :COUNT5;

и т.д. ? 
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534379
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rphoenixто есть создать кучу

Не кучу. Один-единственный запрос, который выберет все оценки всех нужных людей. И этот
запрос целиком я написал выше. Нужна фильтрация по именам - добавляй
соответствующее условие, но ничего другого не трогай.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534380
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovИ этотзапрос *целиком* я написал выше.
А нет, не целиком. Забыл "group by FIO, ocenka".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534381
Rphoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

проcто в условии
Код: sql
1.
Where ((ocenka=2 and fio='Иванов) or (ocenka=3 and fio='Иванов) or (ocenka=3 and fio='Иванов) or (ocenka=4 and fio='Иванов) or (ocenka=5 and fio='Иванов)) into :COUNT1)

?
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534384
Rphoenix
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решил с помощью
Код: sql
1.
For select

и дополнительной таблицей.
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534392
tip78
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чё-то мышление у вас нифига не программистское, а какое-то депутатское
вам же говорят - выбираете БАЗОВЫЙ where, а с него выдираете логикой нужные условия
а не "миллион where с одним и тем же if"
щас ещё и до селектов в циклах дойдём...
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534491
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк Евгений
Код: sql
1.
2.
3.
4.
5.
6.
SELECT t1."человек",
       sum(iif(t2.type = 1, 1, 0)) "количество красных",
       sum(iif(t2.type = 2, 1, 0)) "количество синих"
FROM table2 t1
join table2 t2 on t1."человек" = t2."человек"
GROUP BY 1

Раздражает уже этот вездесущий IIF. Буду в плохом настроении - начну чистить такие "советы".
Пиши на стандартном CASE, не стесняйся.
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534515
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RphoenixИзучаю SQL самостоятельно.можно узнать по какому учебнику? Как вариант взять творение Мартина Грабера, ссылка есть в прилепленной теме.
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534630
Шавлюк Евгений
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSery,

А чем плох IIF? Мне он нравится хотя бы тем, что запись компактнее
Как по мне, то
Код: sql
1.
iif(t2.type = 1, 1, 0) 

выглядит лучше чем
Код: sql
1.
case when t2.type = 1 then 1 else 0 end
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534645
afgm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Шавлюк ЕвгенийWildSery,

А чем плох IIF? Мне он нравится хотя бы тем, что запись компактнее
Как по мне, то
Код: sql
1.
iif(t2.type = 1, 1, 0) 

выглядит лучше чем
Код: sql
1.
case when t2.type = 1 then 1 else 0 end


decode бужет на 1 символ короче :)
Код: sql
1.
2.
sum(iif(t2.type = 2, 1, 0)) "количество синих"
sum(decode(t2.type, 1, 0)) "количество синих"


Но iif нагляднее.
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39534661
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
afgmНо iif нагляднее.case самый понятный.

В данном случае и "else 0" можно не писать.
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39535120
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ivan_PisarevskyafgmНо iif нагляднее.case самый понятный.


case понятнее тому кто кроме английского никаких языков не знает, и доки не имеет.
Его минус в том что много лишних слов.
Если писать в одну строку - то плоховато видно логику.
Если разнести на несколько строк - то запрос расплывается в высоту и становится плохо видно логику запроса.

В данном случае iif уместнее всего.
Но как только вариантов условия становится больше 1-2 то iif тут же сливает и вперед вырывается case .

Ivan_PisarevskyВ данном случае и "else 0" можно не писать.


Варианты с "не писать" - они не относятся к вариантам "самый понятный".
Лучше всего всё писАть явно.

Всё IMHO.
...
Рейтинг: 0 / 0
Подзапрос с сортировкой
    #39535232
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksВ данном случае iif уместнее всего.меня ииф с тоннами скобок уже в фастрепе подзадолбал, что я бывает, грешным делом получаю несколько полей с сервера, где уже все расставлено, а не в отчетнике, хотя идеологически было бы правильней подтасовать данные на клиенте, не напрягая сервер.
fraksЛучше всего всё писАть явно.да, и, обычно, так и делаю: типа as для алиаса поля и двоеточие при присвоении параметра в фор селекте.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Подзапрос с сортировкой
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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