Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.11.06;
Скачать: [xml.tar.bz2];

Вниз

запрос не понимает команды 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.067 c
3-1127467916
vigo
2005-09-23 13:31
2005.11.06
Ошибка инициализации Borland DataBase Engine


4-1125750833
Alloun
2005-09-03 16:33
2005.11.06
альтернатива TBitmap ?


2-1129103955
Zhekson
2005-10-12 11:59
2005.11.06
Контурная карта


2-1129434980
DimaDima
2005-10-16 07:56
2005.11.06
Можно ли обращаться к массивам по индексам в их имени?


14-1129121709
Сергей Орлик
2005-10-12 16:55
2005.11.06
Delphi 2006 or C++Builder 2006 or C#Builder 2006 = BDS 2006





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский