Форум: "Базы";
Текущий архив: 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.044 c