Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос с группировкой и подсчетом сумм 
:(
    Опции темы
Frees
Дата 13.3.2009, 07:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



Цитата(begin @  13.3.2009,  02:35 Найти цитируемый пост)
Но это же BDE - там ведь нельзя использовать вложенные запросы. Разве нет?  smile 

vj;tyj ИВУ пофик что за запрос его же MySQL выполняет 


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
begin
Дата 13.3.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 415
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



Цитата(Kbl4AH @ 13.3.2009,  00:09)
Нда, с запросом немного приврал (без компа делал)...
Вот работающий:user posted image

порылся - в MySQL действительно нужно использовать If вместо Decode. С учетом этого запрос будет выглядеть так:

Код

select code, sum(of1), sum(of2), sum(of3) 
from (select code, if(id_ffice,1,count(code),0) of1, if(id_ffice,2,count(code),0) of2, if(id_ffice,3,count(code),0) of3 
from table group by code,id_ofice) 
group by code


Что такое of1..of3? Это какие то временные переменные для промеждуточного хранения количества найденных полей?

Как мне получить доступ к суммам? Ведь, например, к полю code я получаю доступ так:
Код

i:=query1.Fields.Fields[1].AsInteger;

PM MAIL   Вверх
Kbl4AH
Дата 13.3.2009, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Цитата(begin @  13.3.2009,  13:22 Найти цитируемый пост)
Что такое of1..of3? Это какие то временные переменные для промеждуточного хранения количества найденных полей?

это алиасы полей... поле будет называться так как ты его в вопросе выбираешь, например, if(id_ffice,1,count(code),0), но это неудобно и для него пишут алиас (типа псевдоним в удобной форме)... для алиас исользуется слово as, т.е 
Код

select pole1 as p1, pole2 as p2 from t
 просто я as опускаю... еще без них не обойтись в запросах типа 
Код

select sum(a) from (select sum(a) from t)

будет ошибка, т.к. вложенный запрос возвращает поле с именем sum(a), а вышесто\щий запрос воспринимает его не как название поля, а как операцию суммирования над полем а (которое даже подзапросом и не возвращается)... поэтому надо юзать алиас и делать так 
Код

select suma as sa from (select sum(a) as suma from t)

Цитата(begin @  13.3.2009,  13:22 Найти цитируемый пост)
Как мне получить доступ к суммам? Ведь, например, к полю code я получаю доступ так:

запрос лучше напиши так (добавь алиасы, чтоб не было проблем при модификации запроса; т.е. перед написанием запроса надо решить какие поля он будет возвращать, а реализация может быть разная... в твоем случае возвращает код и какую-то инфу для списка офисов... соответсвенные алиасы и используй)...
Код

select code, sum(of1) of1, sum(of2) of2, sum(of3) of3 
from (select code, if(id_ffice,1,count(code),0) of1, if(id_ffice,2,count(code),0) of2, if(id_ffice,3,count(code),0) of3 
from table group by code,id_ofice) 
group by code

если поле code у тебя 1-е, то поле of1 соответственно будет 2-м...
Код

i:=query1.Fields.Fields[2].AsInteger;

Но обращаться к полю по номеру не рекомендую... лучше обращаться по имени!!!

Это сообщение отредактировал(а) Kbl4AH - 13.3.2009, 15:52
PM MAIL ICQ   Вверх
Akella
Дата 13.3.2009, 17:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



нифигасе вы тут намутили smile 
PM MAIL   Вверх
begin
Дата 14.3.2009, 01:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 415
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



сделал как посоветовали, с алиасами, уже готовый для использования запрос:
Код

query1.SQL.Add('select code,name,price,sum(of1),sum(of2),sum(of3) from '
+'(select code, if(id_ffice,1,count(code),0) as of1, if(id_ffice,2,count(code),0)'
+' as of2, if(id_ffice,3,count(code),0) as of3 from t_tovar where data1=:txt group by code,id_ofice) '
+'group by code');
query1.ParamByName('txt').AsDate:=DateTimePicker4.Date;

но при выполнении запроса выдает ошибку:
Код

expression expected, but 'if' found - Native error: 30160.


где же ошибка? чувствую, что неправильно использую конструкцию if в запросе smile 
PM MAIL   Вверх
Kbl4AH
Дата 14.3.2009, 02:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Цитата(begin @  14.3.2009,  01:51 Найти цитируемый пост)
сделал как посоветовали

тебе посветовали не так, а так
Код

select code, sum(of1) of1, sum(of2) of2, sum(of3) of3 ...

Цитата(begin @  14.3.2009,  01:51 Найти цитируемый пост)
чувствую, что неправильно использую конструкцию if в запросе

неужели?! а в нете позыркать как правильно использовать? ты с MySQL работаешь!!! я с ней не работаю и в глаза не видел...
Цитата

IF(expr1,expr2,expr3) 
Если expr1 равно значению ИСТИНА (expr1 <> 0 и expr1 <> NULL), то функция IF() возвращает expr2, в противном случае - expr3. В зависимости от контекста функция IF() может возвращать либо числовое, либо строковое значение: 
mysql> SELECT IF(1>2,2,3);
        -> 3
mysql> SELECT IF(1<2,'yes','no');
        -> 'yes'

PM MAIL ICQ   Вверх
begin
Дата 14.3.2009, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 415
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



Исправил конструкцию if (стояла запятая вместо знака "равно") и добавил алиасы:
Код

query1.SQL.Add('select code,name,price,sum(of1) as of12,sum(of2) as of22,'
+'sum(of3) as of32,sum(of4) as of42,sum(of5) as of52,sum(of6) as of62'
+' from (select code, if(id_office=1,count(code),0) as of1, if(id_office=2,count(code),0)'
+' as of2, if(id_office=3,count(code),0) as of3, if(id_office=4,count(code),0) as of4'
+', if(id_office=5,count(code),0) as of5, if(id_office=6,count(code),0) as of6'
+' from t_tovar where data1=:txt group by code,id_ofice) group by code');
query1.ParamByName('txt').AsDate:=DateTimePicker4.Date;
query1.Open;


и все равно выдает ту же ошибку  smile 
PM MAIL   Вверх
Kbl4AH
Дата 14.3.2009, 17:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Цитата(begin @  14.3.2009,  16:00 Найти цитируемый пост)
и все равно выдает ту же ошибку

ну, я уже не знаю, чем тебе помочь... потому что запрос - работающий!!!
1) перед добавлением запроса в Query ты очищаешь предыдущий ....SQL.Clear?
2) проверь запрос на работоспособность в SQL с константой вмесо праметра txt.
3) 

пля, тока щас заметил... begin, ты хоть немного думаешь? Тебя же спросили, что запрос должен возвращать...
Цитата(begin @  14.3.2009,  16:00 Найти цитируемый пост)
query1.SQL.Add('select code,name,price,sum(of1) as of12,sum(of2) as of22,'+'sum(of3) as of32,sum(of4) as of42,sum(of5) as of52,sum(of6) as of62'+' from (select code, if(id_office=1,count(code),0) as of1, if(id_office=2,count(code),0)'+' as of2, if(id_office=3,count(code),0) as of3, if(id_office=4,count(code),0) as of4'+', if(id_office=5,count(code),0) as of5, if(id_office=6,count(code),0) as of6'+' from t_tovar where data1=:txt group by code,id_ofice) group by code');query1.ParamByName('txt').AsDate:=DateTimePicker4.Date;query1.Open;

вообще-то, подзапрос не возвращает поля name и price... так что нельзя их выбрать из подзапроса!!! smile 
PM MAIL ICQ   Вверх
begin
Дата 14.3.2009, 22:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 415
Регистрация: 16.5.2007

Репутация: нет
Всего: нет



оказалось, ошибка в самой конструкции if  smile 
Моя MySQL почему то не понимала такую конструкцию. Пришлось сделать так, и все заработало:

Код

squery1.SQL.Add('select code,sum(of0) as of02,sum(of1) as of12,sum(of2) as '
+'of22,sum(of3) as of32,sum(of4) as of42,sum(of5) as of52,sum(of6) as of62 '
+'from (select code,'
+'case when id_office_2=0 then count(code) else 0 end as of0, '
+'case when id_office_2=1 then count(code) else 0 end as of1, '
+'case when id_office_2=2 then count(code) else 0 end as of2, '
+'case when id_office_2=3 then count(code) else 0 end as of3, '
+'case when id_office_2=4 then count(code) else 0 end as of4, '
+'case when id_office_2=5 then count(code) else 0 end as of5, '
+'case when id_office_2=6 then count(code) else 0 end as of6 '
+'from t_tovar where status=1 group by code,id_office_2) group by code order by code asc');


PM MAIL   Вверх
Zloxa
Дата 15.3.2009, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: нет
Всего: 161



ребят, чота вы шибка перемудрили
Аггрегат можно считать по выражению
Код

select code
         , count(case when id_office = 1 then 1 end) off1 -- sum(if(id_office = 1,1,0))
         , count(case when id_office = 2 then 1 end) off2
         , count(case when id_office = 3 then 1 end) off3
...
from table 
group by code

Или я чота недопонял?

ЗЫ.
Я вот давно хотел спросить у когото, кто использует конструкцию типа
Код

Query.SQL.clear;
Query.SQL.Add(SQLText);

Почему нельзя просто:
Код

Query.SQL.Text = SQLText;


Это сообщение отредактировал(а) Zloxa - 15.3.2009, 00:27


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
former
Дата 15.3.2009, 00:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


MEMS Expert
***


Профиль
Группа: Завсегдатай
Сообщений: 1166
Регистрация: 1.3.2006
Где: Россия

Репутация: 7
Всего: 17



Цитата(Zloxa @  15.3.2009,  00:22 Найти цитируемый пост)
Я вот давно хотел спросить у когото, кто использует конструкцию типа
Выделить всёкод Pascal/Delphi
1:
2:
    
Query.SQL.clear;
Query.SQL.Add(SQLText);

Почему нельзя просто:
Выделить всёкод Pascal/Delphi
1:
    
Query.SQL.Text = SQLText;



Zloxa, посмотри предыдущие темы там во многих случаях именно так. Это как кому нравится. smile 


--------------------
Достаточно снизить уровень мышления, чтобы иные почувствовали почву под ногами.
PM MAIL   Вверх
Данкинг
Дата 15.3.2009, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Yersinia pestis
****


Профиль
Группа: Завсегдатай
Сообщений: 8302
Регистрация: 7.11.2006
Где: მოსკოვი

Репутация: 35
Всего: 130



Цитата(Zloxa @  15.3.2009,  00:22 Найти цитируемый пост)
Я вот давно хотел спросить у когото, кто использует конструкцию типа

Дело привычки. Я и так тоже делаю:
Код

Query.SQL.clear;
Query.SQL.Text = SQLText;

 smile 


--------------------
There's nothing left but silent epitaphs.
PM MAIL WWW   Вверх
Kbl4AH
Дата 15.3.2009, 11:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 741
Регистрация: 1.4.2008
Где: Вятка

Репутация: 6
Всего: 15



Zloxa, я раньше делал с Add, т.к. мне так показали, но потом понял, что так неудобно и теперь только Text использую...
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0983 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.