Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Сложность в построении запроса [D7, XP]


Страницы:   1 2

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-код на создание твоих таблиц.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо