Помогите с запросом

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Malone32®
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 23.01.2005 (Вс) 21:19
Откуда: Оттуда

Помогите с запросом

Сообщение Malone32® » 23.04.2008 (Ср) 8:01

Привет, есть таблица с следующими данными:

data module znach
20/01/2008 00:00:00 22 352
20/01/2008 01:00:00 22 350
20/01/2008 02:00:00 22 300
20/01/2008 03:00:00 22 345
21/01/2008 00:00:00 23 142
21/01/2008 01:00:00 23 205
21/01/2008 02:00:00 23 304
21/01/2008 03:00:00 23 312
22/01/2008 00:00:00 24 301
22/01/2008 01:00:00 24 248
22/01/2008 02:00:00 24 189
22/01/2008 03:00:00 24 341

Мне необходимо вывести суммы поля znach за сутки сгруппированные по модулям, т.е. чтобы конечный результат был таким:

data module znach(summa)
20/01/2008 22 1347
21/01/2008 23 963
22/01/2008 24 1079

Как можно это реализовать?
Спасибо

Oxygen
Белая и пушистая
Белая и пушистая
Аватара пользователя
 
Сообщения: 1314
Зарегистрирован: 15.07.2003 (Вт) 7:14
Откуда: Москва

Сообщение Oxygen » 23.04.2008 (Ср) 8:45

А база какая? В Оракле для подобных случаев были 2 чудесных оператора ROLLUP и CUBE. Вообще, GROUP BY тебе в помощь. Сейчас никакой СУБД под руками нет, что бы написать сам запрос, на работе постараюсь посмотреть, если время будет. Правда там только MySQL есть из баз.
Процедура клонирования завершена.
Коррекция имплантированного сознания соответствует принятым алгоритмам.
Уникальный идентификатор скопирован в чип временного паспорта.
Активация прав гражданина ожидается в течение 24 часов

Malone32®
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 23.01.2005 (Вс) 21:19
Откуда: Оттуда

Сообщение Malone32® » 23.04.2008 (Ср) 9:10

База SQL Server 2000

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.04.2008 (Ср) 9:15

Код: Выделить всё
select convert([data],datetime,103), module, sum(znach)
from [table]
group by convert([data],datetime,103), module
Lasciate ogni speranza, voi ch'entrate.

Malone32®
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 23.01.2005 (Вс) 21:19
Откуда: Оттуда

Сообщение Malone32® » 23.04.2008 (Ср) 9:41

Alibek, спасибо, но твой код не работает:( :oops:

Malone32®
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 23.01.2005 (Вс) 21:19
Откуда: Оттуда

Сообщение Malone32® » 23.04.2008 (Ср) 9:43

правда я поправил на:

Код: Выделить всё
select convert(datetime, [data],103), module, sum(znach)
from [table]
group by convert(datetime, [data],103), module

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.04.2008 (Ср) 10:28

Должно работать. table ты заменил на имя таблицы?
Lasciate ogni speranza, voi ch'entrate.

Malone32®
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 23.01.2005 (Вс) 21:19
Откуда: Оттуда

Сообщение Malone32® » 23.04.2008 (Ср) 10:51

Да, заменил, конечно, но выводятся все значения, а не сумма сгруппированная

Malone32®
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 23.01.2005 (Вс) 21:19
Откуда: Оттуда

Сообщение Malone32® » 23.04.2008 (Ср) 10:54

Мне кажется проблема в группировании дат (мешают значания часов). Как сделать чтобы группировал столбец Дата откусывая значения часов, минут и секунд?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.04.2008 (Ср) 11:00

convert(,,103) как раз и преобразует дату в строку в формате dd/mm/yy.
Тогда выкладывай SQL-скрипт на создание таблиц и загрузку тестовых данных.
Lasciate ogni speranza, voi ch'entrate.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 23.04.2008 (Ср) 11:02

Блин, конечно же неправильно.
Пиши convert(varchar(10),[data],103).
Lasciate ogni speranza, voi ch'entrate.

Malone32®
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 116
Зарегистрирован: 23.01.2005 (Вс) 21:19
Откуда: Оттуда

Сообщение Malone32® » 23.04.2008 (Ср) 11:17

Урааа, спасибо Алибек, выручил уже в который раз!!!

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 25.04.2008 (Пт) 15:03

Еще вопрос.
При составлении запроса на удаление повторяющихся записей используется запрос:
Код: Выделить всё
SELECT DISTINCT title FROM  dissert


При этом удаляются записи, которые ПОЛНОСТЬЮ идентичны.
Суть вопроса: каким должен быть запрос, чтобы удалялись только те записи, которые совпадают, например, по трем первым словам?
Спасибо!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.04.2008 (Пт) 15:13

Ты неправильно понимаешь суть DISTINCT.
Этот запрос ничего не удаляет.
Lasciate ogni speranza, voi ch'entrate.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 25.04.2008 (Пт) 15:22

alibek
Согласен, неверно выразился. Но суть та же: получение списка без дубликатов. DISTINCT следит за тем, какие значения были ранее, так что бы они не были продублированы в списке.
Но, поскольку, записи включают в себя несколько слов, то дубликатами признаются полностью совпадающие записи.
Вопрос: можно ли (если можно, то как) использовать какие-либо дополнительные команды, что бы дублированием считалось совпадение, например, только первых трех слов в записи?
Спасибо за ответ!

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.04.2008 (Пт) 15:25

Ты смысл слова "запись" и "поле" в контексте БД понимаешь?
БД без разницы, что у тебя в записях хранится, числа, слова или анекдоты.
Если нужно исключить дубликаты по трем словам, значит делай три поля, по слову в каждое.
Lasciate ogni speranza, voi ch'entrate.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 25.04.2008 (Пт) 15:39

Спасибо за ответ!
Разницу я понимаю.
Если в названии темы диссертации есть, например, 15 слов, то надо делать 15 полей и разбивать текст. А таких записей - более 150 000. Неужели нет более оптимального способа решения задачи сравнения содержимого полей для использования команды DISTINCT?

Может быть, нужна иная логика решения задачи?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 25.04.2008 (Пт) 16:06

Разумеется, подобные задачи решаются иначе.
Создай подчиненную таблицу свойств, которые будут характеризовать каждую запись.
Lasciate ogni speranza, voi ch'entrate.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 25.04.2008 (Пт) 16:11

alibek
Спасибо за совет!
Однако, вероятно, надо что-то иное, надо еще думать.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 217

    TopList