Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Хитрая сортировка 
:(
    Опции темы
Akella
  Дата 1.12.2008, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Есть в базе 2 поля, которые заслуживают внимания в данном вопросе, остальные просто не нужны пока что.
Вот записи в базе могут быть отсортированы так:
Код

select * from treklama order by agency_sort

вот результат

Цитата

квартал
квартал
квартал
квартал
аверс
аверс


Теперь в поле ID_Sort требуется записать числовые значения таким образом, чтобы записи шли поочереди

Цитата

квартал
аверс
квартал
аверс
квартал
квартал



Для наглядности в экселе изобразил так:
user posted image

Не знаю, понятно ли?  smile

Добавлено @ 17:01
Т.е. как бы выхватывая из каждой группы записи, их нужно выстроить одну за другой. Может проще на Delphi соорудить?

Это сообщение отредактировал(а) Akella - 1.6.2012, 12:45
PM MAIL   Вверх
vladimir74
Дата 1.12.2008, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Akella @  1.12.2008,  14:59 Найти цитируемый пост)
Т.е. как бы выхватывая из каждой группы записи, их нужно выстроить одну за другой. Может проще на Delphi соорудить?

это что один раз надо сохранить? тогда если 10 строк - то проще руками, если больше то быстее ИМХО на дельфях
--------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ.
PM MAIL   Вверх
Akella
Дата 1.12.2008, 17:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



пока что в базе всего около 65 тыщ объявлений

Добавлено через 2 минуты и 1 секунду
юзеры молятся smile , ибо если я не сделаю, то они будут сортировать ручками 65000 записей smile

Добавлено через 9 минут и 2 секунды
Пока делаю на дельфи

Тестирую, не знаю, что получиться

Принцип такой. Создаю нужное количество массивов. Потом цикл по массивам

Код

procedure TDM.SortByAgency();
Var
 q: array of TpFIBDataSet;
 i, k, k1:integer;
 aSQL: String;
begin

  tAgSort.Open;
  tAgSort.First;
  i := 0;
  //создаём нужное число НД (наборов данных)
  while not tAgSort.Eof do begin
    SetLength(q, i+1);
    q[i]                                    := TpFIBDataSet.Create(nil);
    q[i].Database                           := dbJDN;
    q[i].Transaction                        := trRead;
    q[i].UpdateTransaction                  := trUpdate;
//в массив только записи конкретного клиента 
    q[i].SelectSQL.Add('select * from treklama where id_agency = '+ tAgSort.FBN('ID').AsString);
    q[i].AutoUpdateOptions.UpdateTableName  := 'TREKLAMA';
    q[i].AutoUpdateOptions.GeneratorName    := 'GEN_TAGENCY_ID';
    q[i].AutoUpdateOptions.KeyFields        := 'ID';
    q[i].GenerateSQLs;
    q[i].Open;
    q[i].FetchAll;
    q[i].First;
    k := k + q[i].RecordCount;
    inc(i);
    tAgSort.Next;
  end;//while not tAgSort.Eof do begin

//по количеству записей 
  For k1 := 0 to k do begin
    For i := 0 to High(q) do begin
      if q[i].Eof then Continue;//если в каком-то наборе закончились записи....
//наверное нужно внести сюда ещё одну переменную из-за наличие continue
      aSQL := 'update treklama set id2 = ' + intToStr(k1) + ' where id = '+q[i].FBN('ID').AsString;
      dbJDN.Execute(aSQL);
    end;
  end;//for k1 := 0

  For i := 0 to High(q) do Freel(q[i]);//Freel = FreeAndNil

  SetLength(q, 0);
end;


PM MAIL   Вверх
Deniz
Дата 2.12.2008, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



Akella, что-то не совсем понятно, а можешь объяснить как-нибудь по другому?
Если есть 3 значения поля (квартал, аверс, жидн), которые идут друг за другом, причем тут группы?
И почему так много записей?
И по какому признаку это группируется?
Может все-таки еще какие-то поля будут учавствовать в алгоритме?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 2.12.2008, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Цитата(Deniz @  2.12.2008,  10:11 Найти цитируемый пост)
Если есть 3 значения поля (квартал, аверс), которые идут друг за другом, причем тут группы?

группы - это образно говоря, т.к. группы объявлений, группа объявлений от квартала, группа объявлений от ЖиДH`а, группа объявлений от Аверса, ну типа объявления могут сгруппированы/отсортированны по ID рекламодателя.

Добавлено @ 10:32
Цитата(Deniz @  2.12.2008,  10:11 Найти цитируемый пост)
И почему так много записей?

Прога написана для редакции газеты, газета выпускает приличное количество объяв, прогу можешь глянуть у мну на сайте.



Это сообщение отредактировал(а) Akella - 1.6.2012, 12:45
PM MAIL   Вверх
Vas
Дата 2.12.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Разбиваем на массивы одинаковых слов, каждому элементу в пределах массива прописываем его порядковый номер, заносим в БД и запросом сортируем.

квартал 1
квартал 2
квартал 3

аверс    1
аверс    2

жидн    1

Код

select * from aaa  order by num, name 

получаем 

аверс    1
жидн    1
квартал    1

аверс    2
квартал    2

квартал    3


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
vladimir74
Дата 2.12.2008, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Akella,  у тебя получилось?
Цитата(Akella @  1.12.2008,  15:25 Найти цитируемый пост)
Принцип такой. Создаю нужное количество массивов. Потом цикл по массивам

в принципе я думал создать три квери, сделать цикл по размеру наибольшего, внутри апдейтить общим счетчиком ID проверяя на конец каждого квери последовательно  ...

Добавлено через 3 минуты и 12 секунд
Vas
я так понял ID станет  ключем. 

--------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ.
PM MAIL   Вверх
Akella
Дата 2.12.2008, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Цитата(Deniz @  2.12.2008,  10:11 Найти цитируемый пост)
И по какому признаку это группируется?

ну я перед обработкой запихиваю группы объявлений в массив датасетов, выше на дельфи код:

Код

 q[i].SelectSQL.Add('select * from treklama where id_agency = '+ tAgSort.FBN('ID').AsString);


т.е. получается массив датасетов, в каждом датасете набор/группа объявлений от конкретного рекламодателя, т.е. 10 рекламодателей, и 10 датасетов в массиве получается

в q[0] объявления от Квартала
в q[1] объявления от Аверса
в q[2] объявления от ЖиДH
в q[3] объявления от ещё от кого-то там

Что нужно сделать?
Первой записи (в поле ID_SORT) датасета q[0] присваимваем 1
Первой записи (в поле ID_SORT) датасета q[1] присваимваем 2
Первой записи (в поле ID_SORT) датасета q[2] присваимваем 3

прошли все записи массива и опять
Второй записи (в поле ID_SORT) датасета q[0] присваимваем 4
Второй записи (в поле ID_SORT) датасета q[1] присваимваем 5
Второй записи (в поле ID_SORT) датасета q[0] присваимваем 6

и т.к.

Теперь когда мы отсортируем записи по полю ID_SORT, то получим такую чехарду, как показано на рисунке
user posted image


Это сообщение отредактировал(а) Akella - 1.6.2012, 12:46
PM MAIL   Вверх
Vas
Дата 2.12.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vladimir74 @  2.12.2008,  10:39 Найти цитируемый пост)
я так понял ID станет  ключем. 

А смысл его делать ключом? Если и делать то составной (Name, ID_Sort).

Цитата(vladimir74 @  2.12.2008,  10:39 Найти цитируемый пост)
в принципе я думал создать три квери

А если не три разных наименования, а n-ое количество, причем заранее не известное smile


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Akella
Дата 2.12.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Цитата(vladimir74 @  2.12.2008,  10:39 Найти цитируемый пост)
Akella,  у тебя получилось?

нет, намудрил я здесь
Код

//по количеству записей 
  For k1 := 0 to k do begin
    For i := 0 to High(q) do begin
      if q[i].Eof then Continue;//если в каком-то наборе закончились записи....
//наверное нужно внести сюда ещё одну переменную из-за наличие continue
      aSQL := 'update treklama set id2 = ' + intToStr(k1) + ' where id = '+q[i].FBN('ID').AsString;
      dbJDN.Execute(aSQL);
    end;
  end;//for k1 := 0


что-то не так, что-то забыл, логика у мну хромает, моск тоже хромает  smile 
PM MAIL   Вверх
Vas
Дата 2.12.2008, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Akella @  2.12.2008,  10:51 Найти цитируемый пост)
Теперь когда мы отсортируем записи по полю ID_SORT, то получим такую чехарду, как показано на рисунке

А в пределах группы сортировка по наименованию не нужна?


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Akella
Дата 2.12.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Цитата(Vas @  2.12.2008,  10:52 Найти цитируемый пост)
А если не три разных наименования, а n-ое количество, причем заранее не известное smile 

Вот именно, мало того, в каждом датасете свой количество объявлений:  от квартала 10, от аверса 50, от ЖиДH 1000.
PM MAIL   Вверх
vladimir74
Дата 2.12.2008, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



перечитал свое, кажется с утра у меня плохл с формулировкой мыслей
Код

myMewID := 1;
for i:=0 to maxQueryRecord-1 do begin
  if not query1.eof do begin
      query1:= 'update .........';
     inc(myMewID);
     query1.next;
  end;
  if not query2.eof do begin
      query2:='update .........';
     inc(myMewID);
     query3.next;
  end;
  if not query3.eof do begin
      query2:= 'update .........';
     inc(myMewID);
     query3.next;
  end;
end;

ну вообщето эти три ифа должеы быть одной функцией, но это уже не принципиально, если речь идет о тулсе которую просто надо быстро запустить....
ИМХО конечно...

Это сообщение отредактировал(а) vladimir74 - 2.12.2008, 10:59
--------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ.
PM MAIL   Вверх
Akella
Дата 2.12.2008, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Цитата(Vas @  2.12.2008,  10:36 Найти цитируемый пост)
select * from aaa  order by num, name 

по идее никаких имён там нет, имя это я привёл для наглядности smile
и там вообще такая сортировка  smile , но это к делу не относится, всё отсортировано до вас smile , осталось отсортировать по последнему полю, но в поле нужно записать правильные значения, чтобы получилась правильная сортировка

Это сообщение отредактировал(а) Akella - 2.12.2008, 11:00
PM MAIL   Вверх
Vas
Дата 2.12.2008, 10:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Akella, а почему на сервере не хочешь сделать, насколько я замечал ты с БД дружишь. 
1. Выбираем строго наименования не повторяющиеся и делаем курсор по этому запросу
Код

select distinct name from table;

2. Цикл по выбранному курсору, внутри цикла выбираем все записи соответсвующие этой группе
Код

select * from table where name=curs.name;

3. Тоже объявляем курсор и внутри курсора апдейтим записи по порядку.
4. Затем сортируем как я уже писал.

Добавлено через 1 минуту и 34 секунды
Цитата(Akella @  2.12.2008,  10:57 Найти цитируемый пост)
по идее никакого имена там нет, имя это я привёл для наглядности

Дык не имя, а какой-то признак для разбивки по группам есть же? 


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Akella
Дата 2.12.2008, 11:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Вот таблица, значение сортировки нужно записать в поле ID2, раньше в него записывалось рэндомное число и объявления сортировались каждый выход газеты тоже рэндомно, все были довольны, теперь хотят по-другому. smile 

Код

CREATE TABLE TREKLAMA (
    ID              "INT" NOT NULL /* "INT" = BIGINT */,
    ID_NAPR         "INT" DEFAULT null /* "INT" = BIGINT */,
    ID_TYPE         "INT" DEFAULT null /* "INT" = BIGINT */,
    ID_RAZDEL       "INT" DEFAULT null /* "INT" = BIGINT */,
    ID_RUBRIKA      "INT" DEFAULT null /* "INT" = BIGINT */,
    ID_REGION       "INT" DEFAULT null /* "INT" = BIGINT */,
    ID_VID          "INT" DEFAULT null /* "INT" = BIGINT */,
    ID_AGENCY       "INT" DEFAULT null /* "INT" = BIGINT */,
    ID_FILIAL       "INT" /* "INT" = BIGINT */,
    ID_METODINPUT   "INT" /* "INT" = BIGINT */,
    SORT_BY_AGENCY  "INT" /* "INT" = BIGINT */,
    INPUT_DATE      DATETIME DEFAULT current_timestamp /* DATETIME = TIMESTAMP */,
    LCD             DATETIME DEFAULT current_timestamp /* DATETIME = TIMESTAMP */,
    TEXT            STR400 COLLATE PXW_CYRL /* STR400 = VARCHAR(400) */,
    START_PUBLIC    DATE1 /* DATE1 = DATE */,
    EXPIREDATE      DATE1 /* DATE1 = DATE */,
    PN              FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    VT              FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    SR              FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    CH              FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    PT              FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    SB              FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    VS              FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    IPADDRESS       STR30 COLLATE PXW_CYRL /* STR30 = VARCHAR(30) */,
    PHONE           STR100 COLLATE PXW_CYRL /* STR100 = VARCHAR(100) */,
    USER_NAME       STR30 COLLATE PXW_CYRL /* STR30 = VARCHAR(30) */,

    ID2             "INT" /* "INT" = BIGINT */,

    DELETED         FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    SORT_NAPR       "INT" /* "INT" = BIGINT */,
    SORT_TYPE       "INT" /* "INT" = BIGINT */,
    SORT_RAZDEL     "INT" /* "INT" = BIGINT */,
    SORT_RUBRIKA    "INT" /* "INT" = BIGINT */,
    SORT_REGION     "INT" /* "INT" = BIGINT */,
    SORT_VID        "INT" /* "INT" = BIGINT */,
    PAYMENT         FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    EXCLUSIVE       FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    DATAS           STR1000 COLLATE PXW_CYRL /* STR1000 = VARCHAR(1000) */,
    REC_TO_EXPORT   FIB$BOOLEAN /* FIB$BOOLEAN = SMALLINT CHECK (VALUE IN (0,1)) */,
    GUID1           STR40 COLLATE PXW_CYRL /* STR40 = VARCHAR(40) */
);



Добавлено через 1 минуту и 46 секунд
Цитата(Vas @  2.12.2008,  10:59 Найти цитируемый пост)
а почему на сервере не хочешь сделать, насколько я замечал ты с БД дружишь. 

Не могу сообразить как это средствами хранимки (Firebird) сделать. Я и на дельфи-то до конца не могу сообразить.

Осталось совсем чуть чуть, довести до ума этот участок, который выдёргивает записи из массива датасетов и записывает в них значения.

Код

//по количеству записей 
  For k1 := 0 to k do begin
    For i := 0 to High(q) do begin
      if q[i].Eof then Continue;//если в каком-то наборе закончились записи....
//наверное нужно внести сюда ещё одну переменную из-за наличие continue
      aSQL := 'update treklama set id2 = ' + intToStr(k1) + ' where id = '+q[i].FBN('ID').AsString;
      dbJDN.Execute(aSQL);
    end;
  end;//for k1 := 0


Добавлено через 2 минуты и 44 секунды
Цитата(Vas @  2.12.2008,  10:59 Найти цитируемый пост)
3. Тоже объявляем курсор и внутри курсора апдейтим записи по порядку.

в PSQL Firebird`а нет возможности объявлять массив курсоров

Добавлено через 3 минуты и 37 секунд
Кофе закончился.  smile 

/*ушёл просить кофе у бухгалтеров

Добавлено через 5 минут и 20 секунд
Наверное забыл про q[i].next  smile 

PM MAIL   Вверх
vladimir74
Дата 2.12.2008, 11:12 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



так у тебя в таблице много рекламодателей?
а новый ID  должен быть сквозным или отдельным для каждого?
Цитата(Akella @  2.12.2008,  08:52 Найти цитируемый пост)
нет, намудрил я здесь
Код

aSQL := 'update treklama set id2 = ' + intToStr(k1) + ' where id = '+q[i].FBN('ID').AsString


ты тут присваеваешь id2 значение верхнего цикла т.е. для всех трех записей у тебя будет одно и тоже значение..., лучше ввести отдельную переменную ....

Добавлено через 4 минуты и 42 секунды
Цитата(Vas @  2.12.2008,  08:52 Найти цитируемый пост)
А если не три разных наименования, а n-ое количество, причем заранее не известное

ну тогда надо сразу делать масив квери...
кажется Akella именно это и сделал. Я просто в начале прочитал массив и решил что хотят работать с простыми массивами...

Добавлено через 8 минут и 53 секунды
Цитата(Akella @  2.12.2008,  09:03 Найти цитируемый пост)
//наверное нужно внести сюда ещё одну переменную из-за наличие continue

ИМХО нужно просто счетчик сделать отдельной переменной...

Добавлено через 9 минут и 42 секунды
Цитата(Akella @  2.12.2008,  09:03 Найти цитируемый пост)
Наверное забыл про q[i].next 

и это тоже....
--------------------
* В доме помешанного не говорят о миксере.* На любой Ваш вопрос у меня есть любой мой ответ.
PM MAIL   Вверх
Akella
Дата 2.12.2008, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Цитата(vladimir74 @  2.12.2008,  11:12 Найти цитируемый пост)
так у тебя в таблице много рекламодателей?

да, в таблице рекламодателей на данный момент пока что 124 записи, а это значит, что в таблице объявлений живут объявления от 124 разных рекламодателей

Добавлено @ 11:36
Цитата(vladimir74 @  2.12.2008,  11:12 Найти цитируемый пост)
Цитата(Akella @  2.12.2008,  08:52 Найти цитируемый пост)
нет, намудрил я здесь
Выделить всёкод Pascal/Delphi
1:
    
aSQL := 'update treklama set id2 = ' + intToStr(k1) + ' where id = '+q[i].FBN('ID').AsString


ты тут присваеваешь id2 значение верхнего цикла т.е. для всех трех записей у тебя будет одно и тоже значение..., лучше ввести отдельную переменную ....

точно... ты прав, надо подумать ещё

Добавлено @ 11:41
Переделал на 
Код

  j := 0;
  For k1 := 0 to k do begin
    For i := 0 to High(q) do begin
      if q[i].Eof then Continue;
      aSQL := 'update treklama set id2 = ' + intToStr( j ) + ' where id = '+q[i].FBN('ID').AsString;
      dbJDN.Execute(aSQL);
      q[i].next;
      Inc(j);
    end;
  end;//for k1 := 0


тестирую, о результатах отпишусь

Это сообщение отредактировал(а) Akella - 2.12.2008, 11:42
PM MAIL   Вверх
Deniz
Дата 2.12.2008, 14:35 (ссылка)  | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



Akella, есть одна мысль, сейчас попробую объяснить.
Допустим есть запрос:
Код
select name, count(*) 
from treklama 
where id_sort is null 
group by name
order by в нужном порядке
который выдает всех рекламодателей (РД) с их объявами (О).
СчетчикСтарт:=0;
Далее, находим минимальное кол-во объяв (обозначим М) и кол-во записей в запросе ( Cnt )
Далее цикл типа такого:
Код
for i:=0 to M-1 do begin
  Sort_Num:=i * cnt + DataSet.RecNo;
  // Выбор записи (только одной) для обновления у текущего Клиента
  update treklama set Sort_ID = :Sort_Num where ...
end;

Аналогично со вторым, третьим и т.д.
Когда прошли всех РД в запросе, делаем переоткрытие запроса, и продолжаем с начала. Значение СчетчикСтарт := max(Sort_ID) + 1;
Делаем пока основной запрос возвращает данные.
Надеюсь понятно объяснил.

Это сообщение отредактировал(а) Deniz - 2.12.2008, 14:37


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 2.12.2008, 15:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Цитата(Deniz @  2.12.2008,  14:35 Найти цитируемый пост)
where id_sort is null 

будет всегда 0 записей, т.к. в базе не бывает записей, где id_sort может быть пустым, это регулируется триггерами  smile

Добавлено через 1 минуту и 23 секунды
Цитата(Deniz @  2.12.2008,  14:35 Найти цитируемый пост)
select name, count(*) 
from treklama 


treklama - это таблица, где хранятся сами объявления, а рекламодатели хранятся в tagency
или я недопонял ход твоих мыслей
PM MAIL   Вверх
Deniz
Дата 2.12.2008, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



Цитата(Akella @  2.12.2008,  18:17 Найти цитируемый пост)
будет всегда 0 записей, т.к. в базе не бывает записей, где id_sort может быть пустым, это регулируется триггерами
ты в это поле записываешь ключ сортировки, и что там было до этого не важно, я так думаю.
Можно поменять запрос на where id_sort = тот признак, при котором надо делать обновление, предполагаю что 0

Цитата(Akella @  2.12.2008,  18:17 Найти цитируемый пост)
treklama - это таблица, где хранятся сами объявления, а рекламодатели хранятся в tagency
или я недопонял ход твоих мыслей 
значит я плохо объясняю.
Как я понял нужно выбрать всех рекламодателей и напечатать по 1 объяве из каждого, потом еще по одной и т.д.
Так вот мысль была такая:
Запросом отбираем, именно из treklama, всех РД и кол-во их объявлений.
Кол-во записей в этом наборе есть шаг приращения Sort_ID, а М это минимальное кол-во объявлений, которое есть у всех.
т.е. если взять первый пост с примером, то
Код
квартал 4
аверс 2
жидн 1
этот запрос дает те объявления, в которых надо обновить сортировку.
Мин = 1
Cnt = 3
Идем по циклу от 0 до М-1, пока 1 раз, получаем по всем РД, Счетчик дорос до 3 (3 записи) и увеличиваем его на 1.
Код
квартал1
аверс2
жидн3
далее переоткрываем запрос, жидн пропадает из результата, его уже обновили, получаем
Код
квартал 3
аверс 1
Мин = 1
Cnt = 2, опять тоже самое, как в первый раз не совсем удачный пример получился.
результат:
Код
квартал4
аверс5

На след итерации останется только
Код
квартал 2
Мин = 2
Cnt = 1
Сейчас нет времени писать код на Delphi, но если не поймешь, может завтра попробую соорудить что-то.



--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
  Дата 2.12.2008, 16:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Цитата(Deniz @  2.12.2008,  15:54 Найти цитируемый пост)
ты в это поле записываешь ключ сортировки, и что там было до этого не важно, я так думаю.

правильно


Цитата(Deniz @  2.12.2008,  15:54 Найти цитируемый пост)
Как я понял нужно выбрать всех рекламодателей и напечатать по 1 объяве из каждого, потом еще по одной и т.д.

ну да


дальше не до конца понял, туплю, разбираюсь в твоём алгоритме

Добавлено через 6 минут и 16 секунд
Всё, вроде получилось  smile , вот окончательный код:

Код

procedure TDM.SortByAgency();
Var
 q: array of TpFIBDataSet;
 i, k, k1, j, trCount: integer;
begin

  tAgSort.Open;
  tAgSort.First;
  i := 0;
  //создаём нужное число НД (наборов данных)
  while not tAgSort.Eof do begin
    SetLength(q, i+1);
    q[i]                                    := TpFIBDataSet.Create(nil);
    q[i].Database                           := dbJDN;
    q[i].Transaction                        := trRead;
    q[i].UpdateTransaction                  := trUpdate;
    q[i].SelectSQL.Add('select id from treklama where id_agency = '+ tAgSort.FBN('ID').AsString);
    q[i].Open;
    q[i].First;
    k := k + q[i].RecordCountFromSrv;
    inc(i);
    tAgSort.Next;
  end;//while not tAgSort.Eof do begin

  if not SP_SET_ID2.Transaction.InTransaction then SP_SET_ID2.Transaction.StartTransaction;

  j := 0;
  trCount := 0;
  For k1 := 0 to k do begin
    For i := 0 to High(q) do begin
      if q[i].Eof then Continue;
      //записываем нужному объявлению значение для сортировки в поле ID2
      SP_SET_ID2.ParamByName('in_id').Value := q[i].FBN('ID').AsInteger;
      SP_SET_ID2.ParamByName('in_id2').Value := j;//
      SP_SET_ID2.ExecProc;

      //обрабатываем транзакцию, каждые 5000 подтверждаем
      Inc(trCount);
      if trCount = 5000 then begin
        if SP_SET_ID2.Transaction.InTransaction then SP_SET_ID2.Transaction.Commit;
        trCount := 0;
      end;

      q[i].next;
      Inc(j);
    end;//For i := 0 to High(q) do begin
  end;//for k1 := 0

  if SP_SET_ID2.Transaction.InTransaction then SP_SET_ID2.Transaction.Commit;

  //высвобождаем ресурсы
  For i := 0 to High(q) do Freel(q[i]);
  SetLength(q, 0);
end;


Всем большое спасибо!!  smile  smile 

Отдам юзерам, пусть теперь они мучаются  smile

Добавлено через 7 минут и 52 секунды
Но я пока что не ставлю вопрос, как решённый.  smile 
"От этих пчёл всего можно ожидать". (с) smile 
PM MAIL   Вверх
Akella
Дата 9.12.2008, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



мда  smile  алгоритм дал сбой, в некоторых места идут записи не поочереди, а подряд  smile  
/*ушёл думать дальше
PM MAIL   Вверх
Deniz
Дата 10.12.2008, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



Akella, мой вариант попробуй, может получится  smile 


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 10.12.2008, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Цитата(Deniz @  2.12.2008,  15:54 Найти цитируемый пост)
Запросом отбираем, именно из treklama, всех РД и кол-во их объявлений.

ну я же так и делаю
Код

  while not tAgSort.Eof do begin
//отбираем из главной таблицы только записи, которые пойдут в публикацию, т.е. с FLAG1 = 1
    aSQL := 'select id from treklama where FLAG1 = 1 and id_agency = '+ tAgSort.FBN('ID').AsString +
                          ' order by sort_napr, sort_type, sort_razdel, sort_rubrika, sort_region, sort_vid';
    v := dbJDN.QueryValueAsStr(aSQL, 0);
    if v = '' then begin
      tAgSort.Next;
      continue;
    end;

    SetLength(q, i+1);
    q[i]                                    := TpFIBDataSet.Create(nil);
    q[i].Database                           := dbJDN;
    q[i].Transaction                        := trRead;
    q[i].UpdateTransaction                  := trUpdate;
    q[i].SelectSQL.Add(aSQL);
    q[i].Open;
    q[i].First;
    k := k + q[i].RecordCountFromSrv;
    inc(i);
    tAgSort.Next;
  end;//while not tAgSort.Eof do begin


Вот получился у меня массив из трёх НД (наборов данных). В одном 10 записей, во - втором 116 и в третьем - 350.

Цитата(Deniz @  2.12.2008,  15:54 Найти цитируемый пост)
Кол-во записей в этом наборе есть шаг приращения Sort_ID, а М это минимальное кол-во объявлений, которое есть у всех.

M = 10 для всех, так?
Приращение для каждого своё: 10, 116 и 350. Так?


Цитата(Deniz @  2.12.2008,  14:35 Найти цитируемый пост)
Далее, находим минимальное кол-во объяв (обозначим М) и кол-во записей в запросе ( Cnt )
Далее цикл типа такого:
Код

for i:=0 to M-1 do begin
  Sort_Num:=i * cnt + DataSet.RecNo;
  // Выбор записи (только одной) для обновления у текущего Клиента
  update treklama set Sort_ID = :Sort_Num where ...
end;



вместо моего?

Код

  j := 0;
  trCount := 0;
  For k1 := 0 to k do begin
    For i := 0 to High(q) do begin

      if q[i].Eof then Continue;//вот это меня смущает..... здесь нужно что-то добавить или переделать

      SP_SET_ID2.ParamByName('in_id').Value  := q[i].FBN('ID').AsInteger;
      SP_SET_ID2.ParamByName('in_id2').Value := j;//
      SP_SET_ID2.ExecProc;

      //обрабатываем транзакцию, каждые 5000 подтверждаем
      Inc(trCount);
      if trCount >= 5000 then begin
        if SP_SET_ID2.Transaction.InTransaction then SP_SET_ID2.Transaction.Commit;
        trCount := 0;
      end;

      q[i].next;
      Inc(j);
    end;//For i := 0 to High(q) do begin
  end;//for k1 := 0


PM MAIL   Вверх
Deniz
Дата 10.12.2008, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



Цитата(Akella @  10.12.2008,  12:26 Найти цитируемый пост)
Приращение для каждого своё: 10, 116 и 350. Так?
нет
Для всех приращение = кол-во записей в наборе (в моем select)
Цитата(Akella @  10.12.2008,  12:26 Найти цитируемый пост)
В одном 10 записей, во - втором 116 и в третьем - 350.
т.е., по моему select получается:
Код

id_agency1: 10
id_agency2: 116
id_agency3: 350
приращение 3, далее расчет
Код

id_agency1: 1, 4, 7, 10, 13, ..., 31
id_agency2: 2, 5, 8, 11, 14, ..., 32
id_agency3: 3, 6, 9, 12, 15, ..., 33
и так до мин кол-ва из поля select у нас 10, 
переоткрываем запрос и получаем:
Код

id_agency2: 106
id_agency3: 340
id_agency1 нет в наборе, потому как ее объявления уже отсортировали, приращение 2 (кол-во записей), счетчик с прошедшего останова = 33, ему +1, в итоге
Код

id_agency2: 34, 36, 38, 40, 42, ..., 
id_agency3: 35, 37, 39, 41, 43, ..., 
и так 106 раз (мин кол-во в select)
Будет желание напишу код на Delphi


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Akella
Дата 10.12.2008, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



попробую  smile 
PM MAIL   Вверх
uranpro
Дата 10.12.2008, 12:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Заинтересовался))))

*ушел кодить*


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
uranpro
Дата 10.12.2008, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



такс)...

создал таблицу
w_test:
FName varchar(50)
ID_Sort int

добавил записи только в fname
a
a
a
a
b
b
b
c
c
d

Delphi>>

Код


Glb, Upd :TADOQuery;

Glb.sql.text :='
SELECT     fname, COUNT(*) AS Qty
FROM         w_TEST
WHERE     (ID_Sort IS NULL)
GROUP BY fname
ORDER BY fname'


Upd.sql.text :='
updete TOP 1 w_test set
ID_Sort = :pID
where 
    (ID_Sort is null) and
    (FName = :pName) '



Код

procedure TForm1.Sort;
var
  Qry:TADOQuery;
  i:integer;
begin

  Qry:=TADOQuery.Create(Self);
  Qry.Connection:=SQLCon;
  with Qry.SQL do begin
    Clear;
    Add('update w_test set id_sort = null'); //очищаем id_sort
    end;
  Qry.ExecSQL;
  Qry.Free;

  Glb.Close; Glb.Open;  i:=1;
  while Glb.RecordCount<>0 do begin
    Glb.First;
    while not Glb.Eof do begin
      with Upd.Parameters do begin
        Items[0].Value:=i;
        Items[1].Value:=Glb.FieldByName('FName').Value;
        end;
      Upd.ExecSQL;
      inc(i);
      Glb.Next;
      end;
    Glb.Close;
    Glb.Open;
    end;
  end;
end;


Добавлено @ 12:49
работает на mssql2005
будет работать на др серверах, если реализовать функцию в UPDATE -> TOP 1

Это сообщение отредактировал(а) uranpro - 10.12.2008, 12:53


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Akella
Дата 10.12.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Попью кофе - попробую.  smile 

В любом случае всем большое спасибо за помощь!!
PM MAIL   Вверх
Akella
Дата 10.12.2008, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Видители в чём дело... вывод объявлений немного сложнее. По идее мой алгоритм работает идеально, если сортировать только по одному полю ID2. Но... сортировка при окончательном выводе немного другая, т.е. вначале онисортируются по другим полям:
sort_napr, sort_type, sort_razdel, sort_rubrika, sort_region, sort_vid

а вот полная сортировка
order by sort_napr, sort_type, sort_razdel, sort_rubrika, sort_region, sort_vid, id2

в процедуре вывода объявлений возможно косяк у меня  smile 
PM MAIL   Вверх
uranpro
Дата 10.12.2008, 13:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



))) завел 60тыс записей...
программа обрабатывает 1000 за 45сек)))


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Akella
Дата 10.12.2008, 14:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Цитата(Deniz @  2.12.2008,  14:35 Найти цитируемый пост)
Надеюсь понятно объяснил.

я запутался в твои сообщениях  smile

Добавлено через 30 секунд
uranpro, время ничто (с) 5ый элемент

Добавлено через 1 минуту и 38 секунд
я жговорю, что у меня не 2 поля для сортировки, а фактически 7. И вот в окончательное 7ое с именем ID2 нужно записать правильные цифры

Добавлено через 2 минуты и 46 секунд
Цитата(uranpro @  10.12.2008,  13:59 Найти цитируемый пост)
))) завел 60тыс записей...
программа обрабатывает 1000 за 45сек))) 

Firebird 60 тысяч записей обрабатывает за 45 секунд, но это уже никакого отношения к делу не имеет
PM MAIL   Вверх
Akella
Дата 10.12.2008, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Сделал тестовую процедуру, которая показывает порядок сортировки:
Код

begin
for select
  r.sort_napr,
  r.sort_type,
  r.sort_razdel,
  r.sort_rubrika,
  r.sort_region,
  r.sort_vid,
  r.id2,
  r.sort_by_agency,
  a.name,
  r.id


from treklama r
  left join tagency a on (a.id = r.id_agency)
WHERE r.rec_to_export = 1
order by 1,2,3,4,5,6,7


into
  :p_sort_napr, :p_sort_type, :p_sort_razdel, :p_sort_rubrika, :p_sort_region, :p_sort_vid, :ID2, :p_sort_by_agency, :P_AGENCY, :id

do
  suspend;
end


вот результаты:

вначале всё идёт идеально, объявления разных РД выводятся поочереди
user posted image

красным обвёл те, которые выстроились подряд.... хотя такого быть не должно, ведь чуть ниже опять вывод нормализовался
user posted image

как всегда в коде какая-нибудь мелочь  smile 
PM MAIL   Вверх
Akella
Дата 10.12.2008, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Начинает доходить, в моём алгоритме у кого меньше всего объявлений, тот в итоге (в дальнейшем) и начинает вылазить первым...

Добавлено @ 16:17
Deniz
Цитата(Deniz @  2.12.2008,  14:35 Найти цитируемый пост)
select name, count(*) 
from treklama 
where id_sort is null 
group by name
order by в нужном порядке


Переделал на
Код

select sort_by_agency, count(*)
from treklama 
where treklama.rec_to_export = 1
group by 1


Результат
SORT_BY_AGENCY    COUNT

SORT_BY_AGENCY    COUNT

1    161
2    305
3    29

я правильно иду?

Не доходит, зачем у тебя where id_sort is null и order by в нужном порядке

Это сообщение отредактировал(а) Akella - 10.12.2008, 16:27
PM MAIL   Вверх
Akella
Дата 10.12.2008, 16:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



Цитата(Deniz @  2.12.2008,  14:35 Найти цитируемый пост)
Далее, находим минимальное кол-во объяв (обозначим М) и кол-во записей в запросе ( Cnt )

переделав запрос на
Код

select sort_by_agency, count(*)
from treklama 
where treklama.rec_to_export = 1
group by 1
order by 2


узнаём, что первая запись в поле count содержит M, минимальное количество объяв.
А количество записей в запросе Cnt = 3
PM MAIL   Вверх
uranpro
Дата 10.12.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Не доходит, зачем у тебя where id_sort is null и order by в нужном порядке

показывает тебе не отсортированные записи


--------------------
I want a perfect soul
PM MAIL ICQ   Вверх
Akella
Дата 10.12.2008, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


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

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



В поле id_sort (у меня оно называется ID2) нет пустых значений.
Принцип такой. Пользователь в таблице каким-либо способом указывает, какие объявления нужно публиковать. Эти объявления помечаются специальном поле.
PM MAIL   Вверх
Deniz
Дата 11.12.2008, 06:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

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



Akella, что-бы нормально алгоритм дорисовать, нужно знать все условия и ограничения.
Например, пользователь определяет список объявлений, в поле id_sort или другое ставится определенный код.
Далее порядок сортировки ... и т.д.
Опиши, может алгоритм вообще другой нужен.

Добавлено через 3 минуты и 19 секунд
Код
select sort_by_agency, count(*)
from treklama 
where treklama.rec_to_export = 1
group by 1
тебе этот запрос надо отсортировать так, в каком порядке пойдут agency, а order by 2 делать не надо


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "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.1670 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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