Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / SQLite Новый топик    Ответить
 Помогите с запросом  [new]
AcidByte
Member

Откуда:
Сообщений: 1
Добрый день, уважаемые гуру

Имеется таблица
автор
CREATE TABLE `participants` (
`participantscode` integer PRIMARY KEY AUTOINCREMENT UNIQUE,
`firstname` text NOT NULL,
`name` text NOT NULL,
`secondname` text,
`pclass` integer ( 4 ),
`pcharacter` TEXT,
`zachet` boolean DEFAULT 0

);

insert into participants (firstname, name, secondname, pclass, pcharacter, zachet) values('Зеленова', 'Надежда', 'Андреевна', 8, 'А', 1);
insert into participants (firstname, name, secondname, pclass, pcharacter, zachet) values('Петров', 'Олег', 'Витальевич', 8, 'А', 0);
insert into participants (firstname, name, secondname, pclass, pcharacter, zachet) values('Иванов', 'Александр', 'Михайлович', 8, 'А', 1);
insert into participants (firstname, name, secondname, pclass, pcharacter, zachet) values('Борисов', 'Константин', 'Львович', 8, 'Б', 1);
insert into participants (firstname, name, secondname, pclass, pcharacter, zachet) values('Белова', 'Валентина', 'Олеговна', 8, 'Б', 0);
insert into participants (firstname, name, secondname, pclass, pcharacter, zachet) values('Сергеев', 'Антон', 'Иванович', 8, 'А', 1);



Нужно составить запрос который бы выводил Класс, Букву, Количество получивших зачет (zachet = 1), Общее количество


Могу посчитать общее количество:
автор
select pclass, pcharacter, count(*) from participants

group by pclass, pcharacter


Или количество получивших зачет:

автор
select pclass, pcharacter, count(*) from participants

where zachet = 1
group by pclass, pcharacter


А как это вместе объединить не могу разобраться.
1 сен 18, 14:08    [21661169]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
White Owl
Member

Откуда:
Сообщений: 12390
Если zachet у тебя всегда 1 или 0, то его можно не считать, а суммировать.
select pclass, pcharacter, count(*), sum(zachet)
 from participants
group by pclass, pcharacter



Для более сложных вещей подобного типа можно использовать WITH

И очень советую полистать англо-русский словарь. Имена колонок чрезвычайно смущают.
1 сен 18, 16:29    [21661245]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 738
1. не надо плодить людей в системе
сделайте 1 таблицу - users и раскидайте их по группам (отдельная таблица). всё.
одни и те же юзеры могут быть как клиентами, так и пользователями системы, и даже 'participants'

2. человекоподобные названия для колонок:
id int unsigned auto_increment,
name1 varchar(64) not null,
name2 varchar(64),
name3 varchar(64),
class tinyint not null,
letter char(1),
passed timestamp,
added timestamp default now()

3. кошег'ный INSERT:
INSERT INTO participants (name1, name2, name3, class, letter, passed) VALUES
('Зеленова', 'Надежда', 'Андреевна', 8, 'А', now()),
('Петров', 'Олег', 'Витальевич', 8, 'А', null),
('Сергеев', 'Антон', 'Иванович', 8, 'А', now());
2 сен 18, 00:40    [21661514]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 738
но это при условии, что passed у юзера бывает только раз в жизни (что маловероятно), а иначе его пихать в другую таблицу и погружаться в нормализацию
2 сен 18, 00:42    [21661515]     Ответить | Цитировать Сообщить модератору
 Re: Помогите с запросом  [new]
полудух
Member

Откуда: планета орков, г.Зверополис
Сообщений: 738
в общем так:
DROP TABLE IF EXISTS participants;

CREATE TABLE participants (
id int AUTO_INCREMENT,
name1   varchar(64) NOT NULL,
name2 varchar(64),
name3 varchar(64),
class   tinyint NOT NULL,
letter char(1) NOT NULL,
passed timestamp NULL default NULL,
added timestamp default now(),

PRIMARY KEY (id)
);

INSERT INTO participants (name3, name1, name2, class, letter, passed) VALUES
('Зеленова', 'Надежда', 'Андреевна', 8, 'А', now()),
('Петров', 'Олег', 'Витальевич', 8, 'А', null),
('Иванов', 'Александр', 'Михайлович', 7, 'А', now()),
('Борисов', 'Константин', 'Львович', 8, 'Б', now()),
('Белова', 'Валентина', 'Олеговна', 8, 'Б', null),
('Сергеев', 'Антон', 'Иванович', 8, 'А', now());


SELECT class, letter, count(*) AS passed_total
FROM participants
WHERE passed IS NOT NULL
GROUP BY passed, class, letter
;

SELECT count(*) AS cnt_total FROM participants;
2 сен 18, 01:10    [21661520]     Ответить | Цитировать Сообщить модератору
Все форумы / SQLite Ответить