![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Сложность в построении запроса [D7, XP]
Mery © (2010-01-12 12:08:00)Не могу сообразить с запросом. подскажите, п-та
есть 2 таблицы: в одной ФИО покупателя, в другой даты покупок, связанные с покупателями. Как выбрать ФИО всех покупателей и даты их ПОСЛЕДНИХ покупок?
turbouser (2010-01-12 20:21:00) [1]Давно уже с fb плотно не работал, но он по моему со 2-й (или даже с 1.5) позволяет группировать по ф-циям, так шта конструкцию iif( (vk.Date_vk_fact>=vk.Date_vk),'*',' ') наверняка можно воткнуть в группировку
Ega23 (2010-01-12 19:41:00) [2]
> это типа прикол?
судя по всему - нет.
Поясняю:
Предположим, у тебя всего 1 человек. У него - 100 покупок, начиная с 1 января и так каждый день в течении 100 дней.
Предположим, что vk.Date_vk_fact = 101.
Что ты хочешь увидеть в выборке?
Mery (2010-01-12 19:25:00) [3]>Плохиш © (12.01.10 15:02) [22]
> Расскажите, что-такое по вашему группировка (group by) и для чего она нужна.
это типа прикол?
select '- '||patient.fam ||' '||patient.im||' '|| iif(patient.ot is not null,patient.ot,'') as fio,
patient.pol,
patient.dr,
max(vk.Date_vk),
iif( (vk.Date_vk_fact>=vk.Date_vk),'*',' ') as priz,
from PATIENT
inner join vk on (patient.id=vk.id_patient)
group by VK.date_vk,patient.FAM,patient.im,patient.ot,
patient.pol, patient.dr
если запрос такой, то выдаст сообщение об ошибке по поводу того, что в группировку не добавлены поля vk.Date_vk_fact
и vk.Date_vk. И запрос не выполнится. Но при добавлении этих полей в group by не выполнится выборка записей с max(vk.Date_vk). вот и весь вопрос.
Плохиш (2010-01-12 15:02:00) [4]
> Mery (12.01.10 14:47) [20]
Расскажите, что-такое по вашему группировка (group by) и для чего она нужна.
Ega23 (2010-01-12 14:54:00) [5]
> но у меня в этом запросе есть ещё условие, которое требует
> дабавить эту группировку.
Учись формулировать вопросы. На твой изначальный вопрос тебе ответили.
Mery (2010-01-12 14:47:00) [6]без группировки по date_vk вроде работает.
но у меня в этом запросе есть ещё условие, которое требует дабавить эту группировку.
iif( (vk.Date_vk_fact>=vk.Date_vk),'*',' ') as priz,
Плохиш (2010-01-12 14:46:00) [7]
> Mery (12.01.10 14:43) [17]
Типа думать это для лохов, а вам готовый код подавай.
Может Вам лучше обратно на кухню?
Ega23 (2010-01-12 14:46:00) [8]
> > да нет же. всё та же ошибка на синтаксис :DatIn = Max(Pr.
> DateIn)
Мда.
Ну тогда найми программиста.
Mery (2010-01-12 14:43:00) [9]>Ega23 © (12.01.10 14:29) [16]
> да нет же. всё та же ошибка на синтаксис :DatIn = Max(Pr.DateIn)
Ega23 (2010-01-12 14:29:00) [10]на:
Create table Pers(
PersID int identity (1,1) not null,
F varchar(32) not null,
I varchar(32) not null,
O varchar(32) not null,
constraint PK_Pers primary key (PersID)
);
Create table Purchasings (
UNID int identity (1,1) not null,
PersID int not null,
DateIn datetime not null,
constraint PK_Purch primary key (UNID),
constraint FK_Purch_Pers foreign key (PersID)
references Pers (PersID)
);
insert into Pers (F,I,O) values ('А', 'А', 'А');
insert into Pers (F,I,O) values ('Б', 'Б', 'Б');
insert into Pers (F,I,O) values ('В', 'В', 'В');
insert into Pers (F,I,O) values ('Г', 'Г', 'Г');
insert into Pers (F,I,O) values ('Д', 'Д', 'Д');
insert into Purchasings (PersID, DateIn) Values (1, 1);
insert into Purchasings (PersID, DateIn) Values (1, 2);
insert into Purchasings (PersID, DateIn) Values (1, 3);
insert into Purchasings (PersID, DateIn) Values (1, 4);
insert into Purchasings (PersID, DateIn) Values (2, 1);
insert into Purchasings (PersID, DateIn) Values (2, 2);
insert into Purchasings (PersID, DateIn) Values (2, 3);
insert into Purchasings (PersID, DateIn) Values (3, 1);
insert into Purchasings (PersID, DateIn) Values (3, 2);
insert into Purchasings (PersID, DateIn) Values (4, 1);
Select FIO = P.F + P.I + P.O, DatIn = Max(Pr.DateIn)
from Pers P inner join Purchasings Pr on (P.PersID = Pr.PersID)
group by P.F, P.I, P.O
Плохиш (2010-01-12 14:24:00) [11]
> Mery (12.01.10 14:04) [10]
> select '- '||patient.fam ||' '||patient.im||' '|| iif(patient.
> ot is not null,patient.ot,'') as fio,
> patient.pol,
> patient.dr,
> max(vk.Date_vk)
> from PATIENT
> inner join vk on (patient.id=vk.id_patient)
> group by VK.date_vk,patient.FAM,patient.im,patient.ot,
> patient.pol, patient.dr
>
Зачем группируете по date_vk?
Mery (2010-01-12 14:18:00) [12]>Ega23 © (12.01.10 14:08) [13]
так надо. щас не об этом.
>1. Я не вижу, что такое vk
это таблица
> оставь в group by только fio
это же невозможно. поле fio - вычисляемое. а в группировке только простые поля указываются, вобще-то.
Ega23 (2010-01-12 14:08:00) [13]
iif(patient.ot is not null,patient.ot,'')
пипец.
А кто тебе мешает при создании таблицы запретить null и default наложить?
Create table ttt (OT varchar(...) NOT NULL DEFAULT '')
Ega23 (2010-01-12 14:06:00) [14]
select '- '||patient.fam ||' '||patient.im||' '|| iif(patient.ot is not null,patient.ot,'') as fio,
patient.pol,
patient.dr,
max(vk.Date_vk)
from PATIENT
inner join vk on (patient.id=vk.id_patient)
group by VK.date_vk,patient.FAM,patient.im,patient.ot,
patient.pol, patient.dr
1. Я не вижу, что такое vk
2. оставь в group by только fio
Ega23 (2010-01-12 14:04:00) [15]
CREATE TABLE PAT (
ID INTEGER NOT NULL,
FAM VARCHAR(40),
IM VARCHAR(40),
OT VARCHAR(40),
POL VARCHAR(1),
DR DATE,
OTD INTEGER,
UCH INTEGER,
USER_NAME VARCHAR(40),
);
Кстати, я бы на твоём месте это дело нормализовал. Я не вижу причин, почему у одного и того же человека не может быть несколько %user_name% :)
Mery (2010-01-12 14:04:00) [16]>Ega23 © (12.01.10 13:49) [9]
select '- '||patient.fam ||' '||patient.im||' '|| iif(patient.ot is not null,patient.ot,'') as fio,
patient.pol,
patient.dr,
max(vk.Date_vk)
from PATIENT
inner join vk on (patient.id=vk.id_patient)
group by VK.date_vk,patient.FAM,patient.im,patient.ot,
patient.pol, patient.dr
тоже самое.
Ega23 (2010-01-12 13:49:00) [17]
> Mery (12.01.10 13:48) [8]
left join
И фигли ты хочешь?
Про группировку я молчу.
Mery (2010-01-12 13:48:00) [18]CREATE TABLE PAT (
ID INTEGER NOT NULL,
FAM VARCHAR(40),
IM VARCHAR(40),
OT VARCHAR(40),
POL VARCHAR(1),
DR DATE,
OTD INTEGER,
UCH INTEGER,
USER_NAME VARCHAR(40),
);
CREATE TABLE DAT_VK (
ID INTEGER NOT NULL,
ID_PAT INTEGER,
DATE_VK DATE,
DATE_VK_FACT DATE,
NUMDOK VARCHAR(20),
PRIZ VARCHAR(1)
);
Сам запрос:
select pat.fam ||' '||pat.im||' '||pat.ot as fio,
pat.pol,
pat.dr,
max(dat_vk.Date_vk) as date_vk
from PAT
left join dat_vk on (pat.id=dat_vk.id_pat)
group by pat.FAM,pat.im,pat.ot,pat.pol,pat.dr, dat_VK.date_vk
turbouser (2010-01-12 13:41:00) [19]
> Mery (12.01.10 13:20) [3]
>
> >turbouser © (12.01.10 12:16) [1]
> нет. всё равно все записи берёт, не выбирая МАХ дату.
>
Видимо, такой join :)
> Ega23 © (12.01.10 13:32) [6]
+1
Ega23 (2010-01-12 13:32:00) [20]
> нет. всё равно все записи берёт, не выбирая МАХ дату.
Давай DDL-код на создание твоих таблиц.