Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.11.06;
Скачать: CL | DM;

Вниз

запрос не понимает команды sql   Найти похожие ветки 

 
erika ©   (2005-09-26 16:25) [0]

select town.namec,
sum(case when kol_pokupok.count_of_idk<=1 then 1 else 0 end) p0,
sum(case when kol_pokupok.count_of_idk<=2 then 1 else 0 end) p5,
sum(case when kol_pokupok.count_of_idk<=3 then 1 else 0 end) p6,
sum(case when kol_pokupok.count_of_idk<=4 then 1 else 0 end) p7,
sum(case when kol_pokupok.count_of_idk<=5 then 1 else 0 end) p8,
sum(case when kol_pokupok.count_of_idk<=6 then 1 else 0 end) p9,
sum(case when kol_pokupok.count_of_idk<=7 then 1 else 0 end) p10,
sum(case when kol_pokupok.count_of_idk<=9 then 1 else 0 end) p12,
sum(case when kol_pokupok.count_of_idk<=10 then 1 else 0 end) p13,
sum(case when kol_pokupok.count_of_idk<=11 then 1 else 0 end) p14,
sum(case when kol_pokupok.count_of_idk<=12 then 1 else 0 end) p15
from kol_pokupok
inner join klients  on klients.ink = kol_pokupok.ink
left outer town on town.namec=klients.namec
order by town.namec

Выдает  ошибку типа:
Token unknown - line 2, char 10.
when.


 
Андрей Жук ©   (2005-09-26 16:33) [1]

А что ты хочешь сделать?


 
erika ©   (2005-09-26 16:39) [2]

хорошо по порядку:
1. в view (kol_pokupok) производится определение количества покупок у определенного клиента, через связь клиент - дисконтнаня книжка - покупки
2. есть таблица (town) - справочник по городам, каждый клиет относится к определенному городу klient.namec
3. нужно найти количество клиентов у которых в настоящий момент только одна покупка, две ... десять
4. вывести в следующем виде: первая колонка город (для этого и пытаюсь произвести группировку), вторая и последующие - количество клиентов у которых сейчас соответсвующее количество покупок.

вот. надеюсь достаточно полно описала задачу.


 
Андрей Жук ©   (2005-09-26 16:54) [3]

Интересно, а как ты хочешь сделать sum без group by но с группирующим полем?


 
}{ander ©   (2005-09-26 17:01) [4]

Не уверен до конца - Release notes IB 6 под рукой нет...
А понимает ли он case?


 
Romkin ©   (2005-09-26 17:04) [5]

1. Case ... when появилось только в FB1.5, раньше не было
2. Стандартно это пожно решить диким left join по 10 копиям одной и той же таблицы... Лучше ХП написать


 
erika ©   (2005-09-26 17:04) [6]


> }{ander ©   (26.09.05 17:01) [4]

теперь точно знаю  что нет
и нужен другой  запрос, а  какой не  могу  составить


 
ANB ©   (2005-09-26 17:27) [7]

А тут и не нужен case
Достаточно group by и order by. Если еще нужно отфильтровать по количеству покупок - то - having.
ЗЫ. А можно пример результата нужного запроса ? А то не сильно понятно, зачем это нужно ?


 
Romkin ©   (2005-09-26 17:30) [8]

НА IB6, имхо, лучше всего ХП. Вот вариант для трех колонок: для одной, двух и более покупок:
SET TERM ^ ;

create PROCEDURE LIST_TOWN_CNTS
returns (TOWN_NAMEC varchar(100), /*город - тип поля каккой там есть...*/
 cnt_1, /*кол-во клиентов с одной покупкой*/
 cnt_2, /*кол-во клиентов с двумя*/
 cnt_more /*кол-во клиентов у которых много покупок (больше двух)*/)
as  
 declare variable count_idk integer;
 declare variable count_client integer;
 
begin
 /* для всех городов */
 for select namec
   from TOWN
   into :town_namec
 do begin
   /*Обнуляем счетчики клиентов*/
   cnt_1 = 0;
   cnt_2 = 0;
   cnt_more = 0;      
   /* Эх! берем количества клиентов, сгруппированные по количеству их покупок...
      и только для данного города */
   for select kp.count_idk, count(kp.ink)
     from kol_pokupok kp join klients k on (kp.ink = k.ink)
     where k.namec = :town_namec
     group by kp.count_idk
     into :count_idk, :count_client
   do begin    
     /*смотрим количества и плюсуем кол-во клиентов с данным количеством в нужную колонку*/
     if (count_idk = 1) then
       cnt_1 = cnt_1 + count_client;
     if (count_idk = 2) then
       cnt_1 = cnt_2 + count_client;

     if (count_idk > 2) then
       cnt_1 = cnt_more + count_client;
       
   end /* for kol_pokupok */
   /*количества собраны, выталкиваем результат (город)*/
   suspend;
 end /* for town */
end
^

SET TERM ; ^


Запрос примитивен: select * from LIST_TOWN_CNTS;
Да, крайне не советовал бы обращаться к view kol_pokupok - индексы в соединении не пойдут. Лучше напрямую к таблицам.


 
}{ander ©   (2005-09-26 20:50) [9]

2 erika ©   (26.09.05 16:25)

Не совсем ясен смысл строки:

left outer town on town.namec=klients.namec

Если klients имеет поле namec, то зачем джойнить еще одну таблицу - town? А вообще, можно запихнуть это все в один монстроидальный запрос (возможны ошибки правописания, т.к. не проверял на живой базе):


select distinct k1.namec,
(select count(*)
from kol_pokupok kp, klients k
where k.namec=k1.namec and k.ink = kp.ink and kp.count_of_idk=1) p0,
...
(select count(*)
from kol_pokupok kp, klients k
where k.namec=k1.namec and k.ink = kp.ink and kp.count_of_idk=12) p12,
from klients k1
order by k1.namec


Кстати, заметь, что значки - не <=, а =, иначе не получится вот это:
3. нужно найти количество клиентов у которых в настоящий момент только одна покупка, две ... десять


 
msguns ©   (2005-09-27 09:36) [10]

И мне непонятно, зачем надо выделять кол-во покупок, неужели нельзя просто просуммировать и подсчитать к-во покупок ?  Простым запросом типа
 SELECT .. SUM.. COUNT..

Если же приспичила дифференциация, то этот запрос "зашаманить" в ХП и выборку делать их ХП.

ИМХО, что-то темнит барышня ;))


 
erika ©   (2005-09-27 15:16) [11]

выявилась ошибка при внесении данных пользователями/давненькая/
пытаюсь найти мах количество и натыкаюсь на это null/
а хотелось бы вывести количество записей, где max(sells.nomber)=0/0 - это значение такое первая скидка считается/ и количество записей, в которых вообще скидка не числится:
1/ есть таблица discont, где IDK - PK, где INK-FK
2/ есть таблица sells, где IDS-PK, IDK- FK, nomber - скидка - integer
3/ пишу запрос /выполняется на ура/:
create view1 (...)
as
select discont.idk, max(sells.nomber) max_p
from discont, sells
where discont.idk=sells.idk
4/ есть таблица kliets, где INK-PK, namec- определение города
5/ пишу запрос /выполяется на ура, но пользователи говорят неверный/:
create view2 (...)
as
select klients.namec, view1.max_p, count(*)
from klients, view1
where klients.ink=view.ink
group by klients.namec, view1.max_p
ВОПРОС: в п.5 есть ошибка


 
msguns ©   (2005-09-27 15:33) [12]

select klients.namec, view1.max_p, count(*)
from klients, view1
where klients.ink=view1.ink
group by klients.namec, view1.max_p


 
erika ©   (2005-09-27 15:34) [13]


> where klients.ink=view1.ink


> where klients.ink=view.ink

извините  опечатка, а  других ошибок  нет


 
msguns ©   (2005-09-27 15:55) [14]

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



Страницы: 1 вся ветка

Текущий архив: 2005.11.06;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.032 c
9-1118496600
Cerberus
2005-06-11 17:30
2005.11.06
Cоздание RPG


14-1129671062
rosl
2005-10-19 01:31
2005.11.06
ehlib 4


2-1129296467
kolos_rus
2005-10-14 17:27
2005.11.06
Descktop на DELPHI


6-1122308027
Sergey2919
2005-07-25 20:13
2005.11.06
Стартовая страница IE


3-1127652661
MakedoneZ
2005-09-25 16:51
2005.11.06
Мобильность программы с исп. MSAccess