Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как в запросе оперировать с суммой, вычислемой в самом запросе? / 11 сообщений из 11, страница 1 из 1
02.04.2010, 15:45
    #36558166
init01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в запросе оперировать с суммой, вычислемой в самом запросе?
В общем из таблицы

Код: plaintext
1.
2.
3.
PROJECT
DIRECTORY
SIZE
DATA

делается такой запрос:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SELECT PROJECT,
sum(case when DIRECTORY='bigsan0' then SIZE end) BIGSAN0,
sum(case when DIRECTORY='bigsan1' then SIZE end) BIGSAN1,
sum(case when DIRECTORY='bigsan2' then SIZE end) BIGSAN2,
sum(case when DIRECTORY='bigsan3' then SIZE end) BIGSAN3,
sum (SIZE) TOTAL,
DATA
FROM PRSIZE
WHERE
DATA="20100401"
GROUP BY PROJECT");

каждый проект хранится в 4 директориях (bigsan0,1,2,3)- в таблице выводится размер каждой и в последней колонке сумма

Всё работает прелестно ...
НО
пользователям захотелось, чтобы
- была сортировка по TOTAL;
- чтобы можно было выводить только те проекты, где TOTAL к примеру более 50Gb.

Сортировка не получается:
GROUP BY TOTAL
GROUP BY sum (SIZE)

Error: aggregate functions are not allowed in the GROUP BY clause
ORDER BY TOTAL
ORDER BY sum (SIZE)

выдаёт только последний проект
GROUP BY sum (SIZE) TOTAL
ORDER BY sum (SIZE) TOTAL

Error: near "TOTAL": syntax error

Обрезание тоже не выходит:
AND TOTAL>50000000
AND sum (SIZE) > 50000000

Error: misuse of aggregate: sum()
AND sum (SIZE) TOTAL>50000000
Error: near "TOTAL": syntax error




__________________________________________________________________________
Учиться на ошибках, особенно чужих, значит сделать свою жизнь скучной.
...
Рейтинг: 0 / 0
02.04.2010, 15:46
    #36558168
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в запросе оперировать с суммой, вычислемой в самом запросе?
HAVING ...
...
Рейтинг: 0 / 0
02.04.2010, 15:55
    #36558195
init01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в запросе оперировать с суммой, вычислемой в самом запросе?
Ого как оперативно.
Спасибо! Для обрезания действительно подошло. А сортировку значит невозможно-таки сделать?




__________________________________________________________________________
Учиться на ошибках, особенно чужих, значит сделать свою жизнь скучной.
...
Рейтинг: 0 / 0
02.04.2010, 17:42
    #36558510
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в запросе оперировать с суммой, вычислемой в самом запросе?
И сортировку возможно - с помощью подзапроса:

Код: plaintext
select * from (select ... having ...) as x order by x.y
...
Рейтинг: 0 / 0
02.04.2010, 17:47
    #36558520
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в запросе оперировать с суммой, вычислемой в самом запросе?
Сортировку надо всегда делать на клиенте.
Ну нарисовал ты юзеру табличку на экране отсортированую по Total, а юзеру захотелось обратно отстортировать, по имени проекта. Ты будешь переписывать запрос и снова посылать его в базу будешь?
...
Рейтинг: 0 / 0
02.04.2010, 19:13
    #36558670
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в запросе оперировать с суммой, вычислемой в самом запросе?
White OwlСортировку надо всегда делать на клиенте.

Вопиюще неверное утверждение.

White Owl
Ну нарисовал ты юзеру табличку на экране отсортированую по Total, а юзеру захотелось обратно отстортировать, по имени проекта. Ты будешь переписывать запрос и снова посылать его в базу будешь?

Точно, буду посылать новый запрос. Как пример:

Код: plaintext
select ... from ... order by sortfield limit  10  offset  1000000000 ;

А вы будете все миллиарды записей на клиента пересылать только для того, чтобы десяток отображаемых можно было отсортировать в другом порядке?.. Пользователи вас расстреляют... и правильно сделают ;-)
...
Рейтинг: 0 / 0
02.04.2010, 20:12
    #36558740
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в запросе оперировать с суммой, вычислемой в самом запросе?
MBGWhite OwlСортировку надо всегда делать на клиенте.

Вопиюще неверное утверждение.

White Owl
Ну нарисовал ты юзеру табличку на экране отсортированую по Total, а юзеру захотелось обратно отстортировать, по имени проекта. Ты будешь переписывать запрос и снова посылать его в базу будешь?

Точно, буду посылать новый запрос. Как пример:

Код: plaintext
select ... from ... order by sortfield limit  10  offset  1000000000 ;

А вы будете все миллиарды записей на клиента пересылать только для того, чтобы десяток отображаемых можно было отсортировать в другом порядке?.. Пользователи вас расстреляют... и правильно сделают ;-)MBG, я вас уважаю, но вы сумасшедший.
Какие нафиг миллиарды записей? Если клиент потребовал миллиард записей, значит он не понимает чего ему надо. Никогда, ни при каких условиях, нету смысла пересылать на клиента больше сотни строк. Человек в принципе не в состоянии просмотреть глазами большее количество данных. Редко кто до тридцатой строки дотягивает да и то, только если специально что-то ищет.
Группировки, фильтры, различные аггрегаты, многоуровневая детализация - да. Но выдавать на клиента больше сотни строк это абсолютная глупость.
Ваш запрос
Код: plaintext
select ... from ... order by sortfield limit  10  offset  1000000000 ;
намекающий на постраничный вывод данных это забавная игра ума, но и только. Ни один живой человек не будет сидеть и листать все ваши страницы.
А если кто-то захочет со мной спорить - откройте наш форум по SQLite и прочитайте (внимательно прочитайте, а не просто увидьте что там что-то написано) все заголовки тем, кто их начал и кто и когда последний в них ответил. Сначала на первой странице, потом на второй странице, потом на третей.... если сможете конечно.
...
Рейтинг: 0 / 0
02.04.2010, 20:47
    #36558772
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в запросе оперировать с суммой, вычислемой в самом запросе?
White OwlГруппировки, фильтры, различные аггрегаты, многоуровневая детализация - да. Но выдавать на клиента больше сотни строк это абсолютная глупость.
Ваш запрос
Код: plaintext
select ... from ... order by sortfield limit  10  offset  1000000000 ;
намекающий на постраничный вывод данных это забавная игра ума, но и только. Ни один живой человек не будет сидеть и листать все ваши страницы.

Пример 1: во всех (или почти всех) корпоративных системах существует требование выгрузки всех отчетов в установленной форме, после чего их печатают, подписывают и отправляют в архив. Отчеты обычно выгружаются в эксель, по 65 000 строк на лист, десятки листов...

Пример 2: постраничное листание выборки. К примеру, в биллинге на одной АТС могут быть сотни портов, в документообороте - у одного партнера могут быть сотни заявок в сутки и т.п. Бывают и выборки (да, уже агрегированные) на десятки тысяч записей, скажем, квартальный отчет одного из операторов сотовой связи по дилерам - и именно в таком виде этот отчет сдается из макрорегионального офиса в российский.

И есть такая профессия - аналитик, который получает деньги именно за работу с подобными данными. Даже спам, случается, приходит - за определенную таксу составим список 1000 ваших конкурентов по данным популярных поисковиков.
...
Рейтинг: 0 / 0
02.04.2010, 21:22
    #36558802
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в запросе оперировать с суммой, вычислемой в самом запросе?
MBGПример 1: во всех (или почти всех) корпоративных системах существует требование выгрузки всех отчетов в установленной форме, после чего их печатают, подписывают и отправляют в архив. Отчеты обычно выгружаются в эксель, по 65 000 строк на лист, десятки листов...Конечно-конечно, при этом начальник самолично проверяет все листы идущие в архив и ни одна запятая заложенная вороватым бухгалтером не проскочит мимо его внимания.
При этом он регулярно занимается пересотрировкой всех 65536 строк на каждом из листов чтобы было удобнее ловить лишние нолики впихнутые туда злоумышленником.
А через два года приходит налоговая и начинает проверять все эту гору бумаг заново.
Да, я знаю что такая практика существует на самом деле. Только от того что она существует она не перестает быть идиотской и главное не эффективной.

MBGПример 2: постраничное листание выборки. К примеру, в биллинге на одной АТС могут быть сотни портов, в документообороте - у одного партнера могут быть сотни заявок в сутки и т.п. Бывают и выборки (да, уже агрегированные) на десятки тысяч записей, скажем, квартальный отчет одного из операторов сотовой связи по дилерам - и именно в таком виде этот отчет сдается из макрорегионального офиса в российский.Есть некоторая разница между выгрузкой данных для отдачи их в другую базу данных и сортировкой этих данных, вы не находите? Процедура репликации данных не требует переменной сортировки.

MBGИ есть такая профессия - аналитик, который получает деньги именно за работу с подобными данными. Даже спам, случается, приходит - за определенную таксу составим список 1000 ваших конкурентов по данным популярных поисковиков.Угу. Хорошо, и что я буду делать с этим списком из 1000 моих конкурентов? Мне не нужна тысяча, мне нужен максимум десяток из моих непосредственных конкурентов. Тех кто оперирует в моем регионе, тех кто реально имеет шанс отобрать у меня клиентов. И даже в этом случае мне максимум тройка лидеров будет интересна.
...
Рейтинг: 0 / 0
02.04.2010, 21:42
    #36558827
MBG
MBG
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в запросе оперировать с суммой, вычислемой в самом запросе?
White Owl
Да, я знаю что такая практика существует на самом деле. Только от того что она существует она не перестает быть идиотской и главное не эффективной.
Согласен, вот только мне так и не удалось ни в одной системе от постраничного листания избавиться, хотя и поиск и сортировка есть. Мне оно поперек горла, т.к. offset для выборки, мягко говоря, неэффективен, но деваться некуда, пользователю позарез надо - такая уж практика работы с документами.

White Owl
Угу. Хорошо, и что я буду делать с этим списком из 1000 моих конкурентов? Мне не нужна тысяча, мне нужен максимум десяток из моих непосредственных конкурентов. Тех кто оперирует в моем регионе, тех кто реально имеет шанс отобрать у меня клиентов. И даже в этом случае мне максимум тройка лидеров будет интересна.
А мне из конкурентов и вовсе интересны только те, кто на те же тендеры документы подает, а их я знаю и так :-) Но раз спам шлют, значит, услуга востребована и кто-то сидит и листает выдачу поисковиков. Опять же, такая практика...
...
Рейтинг: 0 / 0
05.04.2010, 11:34
    #36560740
init01
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как в запросе оперировать с суммой, вычислемой в самом запросе?
MBG!
Спасибо!
Да, точно, у меня на выходных как раз пришла мысль о встроенном selecte. Просто ни разу такого не применял, поэтому не сразу додумался.

White Owl!
Вариант про клиента я тоже рассматривал. Я в PHP загоняю данные в массив:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
$db = new PDO('sqlite:pr_size.db');
$result = $db->query("SELECT PROJECT,
sum(case when DIRECTORY='bigsan0' then SIZE end) BIGSAN0,
sum(case when DIRECTORY='bigsan1' then SIZE end) BIGSAN1,
sum(case when DIRECTORY='bigsan2' then SIZE end) BIGSAN2,
sum(case when DIRECTORY='bigsan3' then SIZE end) BIGSAN3,
sum (SIZE) TOTAL
FROM PRSIZE WHERE PROJECT LIKE '".$_POST['proj']."'
AND DATA=".$_POST['dateone']." GROUP BY PROJECT
HAVING sum (SIZE) > " .($_POST['sizemore']* 1000 ));

Но так как я в PHP ещё только начинаю разбираться, то пока не совсем в курсАх как потом оперировать с массивом. А так как пользователям нужно всего две сортировки ... точнее даже так - некоторым пользователям нужна сортировка только по названию, а некоторым только по размеру, то мне легче два php-файла для них разных написать.




___________________________________________________________________________
Учиться на ошибках, особенно чужих, значит сделать свою жизнь скучной.
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как в запросе оперировать с суммой, вычислемой в самом запросе? / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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