powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как в запросе оперировать с суммой, вычислемой в самом запросе?
11 сообщений из 11, страница 1 из 1
Как в запросе оперировать с суммой, вычислемой в самом запросе?
    #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
Как в запросе оперировать с суммой, вычислемой в самом запросе?
    #36558168
MBG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
MBG
Гость
HAVING ...
...
Рейтинг: 0 / 0
Как в запросе оперировать с суммой, вычислемой в самом запросе?
    #36558195
init01
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ого как оперативно.
Спасибо! Для обрезания действительно подошло. А сортировку значит невозможно-таки сделать?




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

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

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

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

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

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

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

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

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

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

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

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

White Owl
Угу. Хорошо, и что я буду делать с этим списком из 1000 моих конкурентов? Мне не нужна тысяча, мне нужен максимум десяток из моих непосредственных конкурентов. Тех кто оперирует в моем регионе, тех кто реально имеет шанс отобрать у меня клиентов. И даже в этом случае мне максимум тройка лидеров будет интересна.
А мне из конкурентов и вовсе интересны только те, кто на те же тендеры документы подает, а их я знаю и так :-) Но раз спам шлют, значит, услуга востребована и кто-то сидит и листает выдачу поисковиков. Опять же, такая практика...
...
Рейтинг: 0 / 0
Как в запросе оперировать с суммой, вычислемой в самом запросе?
    #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
11 сообщений из 11, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как в запросе оперировать с суммой, вычислемой в самом запросе?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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