| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Базы данных и репортинг > Запрос с группировкой и подсчетом сумм |
| Автор: begin 12.3.2009, 01:14 | ||
Есть таблица товаров:
Нужно выбрать все id_tovar где status<3, но при этом нужно сгруппировать товары с одинаковым полем code, и подсчитать сколько их есть в каждом из филиалов (обозначены id_office). Работаю с MySQL через BDE. Подскажите, как можно составить такой запрос? Ничего на ум не приходит, кроме каких-то промежуточных запросов и временных массивов. |
| Автор: Akella 12.3.2009, 02:35 | ||
может меня кто поправит?
|
| Автор: Данкинг 12.3.2009, 02:39 |
| Akella, а по вычисляемому полю (т.е. count) разве будет работать group ? |
| Автор: Akella 12.3.2009, 02:54 | ||
значит
|
| Автор: Frees 12.3.2009, 07:22 |
| Akella, в твоем примере count всегда 1 будет возвращать, т.к группировать ничего не будет потому что выбран id_tovar |
| Автор: Akella 12.3.2009, 13:13 |
| и вообще group by должен идти последним |
| Автор: Akella 12.3.2009, 13:44 | ||
|
| Автор: Kbl4AH 12.3.2009, 16:33 | ||
ЗЫ. begin, ты, по-моему, сам не понял что спросил... Приводи кусок таблицы и нужный результат и запрос тебе будет обеспечен! |
| Автор: begin 12.3.2009, 22:36 | ||||
| Уточню: мне нужно подсчитать количество разных code в каждой из id_office. Если в таблице будут такие данные:
то запрос должен выдать такую таблицу:
|
| Автор: Kbl4AH 12.3.2009, 23:29 | ||||||
совершенно разные вещи... Добавлено через 3 минуты и 30 секунд
|
| Автор: Kbl4AH 13.3.2009, 00:09 |
| Нда, с запросом немного приврал (без компа делал)... Вот работающий:http://ipicture.ru/ |
| Автор: begin 13.3.2009, 00:10 | ||||
А после выполнения запроса из каких переменных брать количество каждого кода в каждом из филиалов? А то я что то запутался в вашем примере.. |
| Автор: begin 13.3.2009, 00:35 |
| Но это же BDE - там ведь нельзя использовать вложенные запросы. Разве нет? |
| Автор: Kbl4AH 13.3.2009, 00:39 | ||
не знаю.... но мне кажется можно... для MySQL вместо decode - if |
| Автор: Frees 13.3.2009, 07:14 | ||
vj;tyj ИВУ пофик что за запрос его же MySQL выполняет |
| Автор: begin 13.3.2009, 13:22 | ||||||
порылся - в MySQL действительно нужно использовать If вместо Decode. С учетом этого запрос будет выглядеть так:
Что такое of1..of3? Это какие то временные переменные для промеждуточного хранения количества найденных полей? Как мне получить доступ к суммам? Ведь, например, к полю code я получаю доступ так:
|
| Автор: Kbl4AH 13.3.2009, 15:50 | ||||||||||||||
это алиасы полей... поле будет называться так как ты его в вопросе выбираешь, например, if(id_ffice,1,count(code),0), но это неудобно и для него пишут алиас (типа псевдоним в удобной форме)... для алиас исользуется слово as, т.е
будет ошибка, т.к. вложенный запрос возвращает поле с именем sum(a), а вышесто\щий запрос воспринимает его не как название поля, а как операцию суммирования над полем а (которое даже подзапросом и не возвращается)... поэтому надо юзать алиас и делать так
запрос лучше напиши так (добавь алиасы, чтоб не было проблем при модификации запроса; т.е. перед написанием запроса надо решить какие поля он будет возвращать, а реализация может быть разная... в твоем случае возвращает код и какую-то инфу для списка офисов... соответсвенные алиасы и используй)...
если поле code у тебя 1-е, то поле of1 соответственно будет 2-м...
Но обращаться к полю по номеру не рекомендую... лучше обращаться по имени!!! |
| Автор: Akella 13.3.2009, 17:58 |
| нифигасе вы тут намутили |
| Автор: begin 14.3.2009, 01:51 | ||||
сделал как посоветовали, с алиасами, уже готовый для использования запрос:
но при выполнении запроса выдает ошибку:
где же ошибка? чувствую, что неправильно использую конструкцию if в запросе |
| Автор: Kbl4AH 14.3.2009, 02:21 | ||||
тебе посветовали не так, а так
неужели?! а в нете позыркать как правильно использовать? ты с MySQL работаешь!!! я с ней не работаю и в глаза не видел...
|
| Автор: begin 14.3.2009, 16:00 | ||
Исправил конструкцию if (стояла запятая вместо знака "равно") и добавил алиасы:
и все равно выдает ту же ошибку |
| Автор: Kbl4AH 14.3.2009, 17:35 | ||
ну, я уже не знаю, чем тебе помочь... потому что запрос - работающий!!! 1) перед добавлением запроса в Query ты очищаешь предыдущий ....SQL.Clear? 2) проверь запрос на работоспособность в SQL с константой вмесо праметра txt. 3) пля, тока щас заметил... begin, ты хоть немного думаешь? Тебя же спросили, что запрос должен возвращать...
вообще-то, подзапрос не возвращает поля name и price... так что нельзя их выбрать из подзапроса!!! |
| Автор: begin 14.3.2009, 22:13 | ||
| оказалось, ошибка в самой конструкции if Моя MySQL почему то не понимала такую конструкцию. Пришлось сделать так, и все заработало:
|
| Автор: Zloxa 15.3.2009, 00:22 | ||||||
| ребят, чота вы шибка перемудрили Аггрегат можно считать по выражению
Или я чота недопонял? ЗЫ. Я вот давно хотел спросить у когото, кто использует конструкцию типа
Почему нельзя просто:
|
| Автор: former 15.3.2009, 00:34 | ||
Zloxa, посмотри предыдущие темы там во многих случаях именно так. Это как кому нравится. |
| Автор: Данкинг 15.3.2009, 00:41 | ||||
Дело привычки. Я и так тоже делаю:
|
| Автор: Kbl4AH 15.3.2009, 11:02 |
| Zloxa, я раньше делал с Add, т.к. мне так показали, но потом понял, что так неудобно и теперь только Text использую... |