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

Вниз

Сложность в построении запроса   Найти похожие ветки 

 
Mery   (2010-01-12 12:08) [0]

Не могу сообразить с запросом. подскажите, п-та
есть 2 таблицы: в одной ФИО покупателя, в другой даты покупок, связанные с покупателями. Как выбрать ФИО всех покупателей и даты их ПОСЛЕДНИХ покупок?


 
turbouser ©   (2010-01-12 12:16) [1]

select F.ФИО, MAX(D.даты покупок) таблица_фио F join таблица_дат D on F.xxx=D.xxx
group by F.ФИО


 
Ega23 ©   (2010-01-12 12:23) [2]


Create table Pers(
PersID int identity (1,1) not null,
FIO 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 (FIO) values ("ААА");
insert into Pers (FIO) values ("БББ");
insert into Pers (FIO) values ("ВВВ");
insert into Pers (FIO) values ("ГГГ");
insert into Pers (FIO) 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 * from Purchasings

Select P.FIO, DatIn = Max(Pr.DateIn)
 from Pers P inner join Purchasings Pr on (P.PersID = Pr.PersID)
 group by P.FIO


 
Mery   (2010-01-12 13:20) [3]

>turbouser ©   (12.01.10 12:16) [1]
нет. всё равно все записи берёт, не выбирая МАХ дату.

>Ega23 ©   (12.01.10 12:23) [2]
даёт ошибку на синтаксис: нельзя использовать знак =.

кстати, пользуюсь Firebird 2.0. Компаненты IB.


 
Sergey13 ©   (2010-01-12 13:27) [4]

> [3] Mery   (12.01.10 13:20)
> даёт ошибку на синтаксис: нельзя использовать знак =.

Ужас! Пожалуйся на Ega23 в милицию. Дает непроверенный на твоем "кстати" серваке код.


 
Ega23 ©   (2010-01-12 13:30) [5]


> даёт ошибку на синтаксис: нельзя использовать знак =.


Ты не указал СУБД. Для MSSQL всё прекрасно работает.
Select P.FIO, DatIn = Max(Pr.DateIn)
замени на
Select P.FIO, Max(Pr.DateIn) as DateIn


 
Ega23 ©   (2010-01-12 13:32) [6]


> нет. всё равно все записи берёт, не выбирая МАХ дату.


Давай DDL-код на создание твоих таблиц.


 
turbouser ©   (2010-01-12 13:41) [7]


> Mery   (12.01.10 13:20) [3]
>
> >turbouser ©   (12.01.10 12:16) [1]
> нет. всё равно все записи берёт, не выбирая МАХ дату.
>

Видимо, такой join :)

> Ega23 ©   (12.01.10 13:32) [6]

+1


 
Mery   (2010-01-12 13:48) [8]

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


 
Ega23 ©   (2010-01-12 13:49) [9]


> Mery   (12.01.10 13:48) [8]


left join

И фигли ты хочешь?
Про группировку я молчу.


 
Mery   (2010-01-12 14:04) [10]

>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 14:04) [11]

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%   :)


 
Ega23 ©   (2010-01-12 14:06) [12]

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:08) [13]

iif(patient.ot is not null,patient.ot,"")

пипец.
А кто тебе мешает при создании таблицы запретить null и default наложить?

Create table ttt (OT varchar(...) NOT NULL DEFAULT "")


 
Mery   (2010-01-12 14:18) [14]

>Ega23 ©   (12.01.10 14:08) [13]
так надо. щас не об этом.
>1. Я не вижу, что такое vk
это таблица

> оставь в group by только fio
это же невозможно. поле fio - вычисляемое. а в группировке только простые поля указываются, вобще-то.


 
Плохиш ©   (2010-01-12 14:24) [15]


> 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?


 
Ega23 ©   (2010-01-12 14:29) [16]

на:


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


 
Mery   (2010-01-12 14:43) [17]

>Ega23 ©   (12.01.10 14:29) [16]
> да нет же. всё та же ошибка на синтаксис :DatIn = Max(Pr.DateIn)


 
Ega23 ©   (2010-01-12 14:46) [18]


> > да нет же. всё та же ошибка на синтаксис :DatIn = Max(Pr.
> DateIn)


Мда.
Ну тогда найми программиста.


 
Плохиш ©   (2010-01-12 14:46) [19]


> Mery   (12.01.10 14:43) [17]

Типа думать это для лохов, а вам готовый код подавай.
Может Вам лучше обратно на кухню?


 
Mery   (2010-01-12 14:47) [20]

без группировки по date_vk вроде работает.
но у меня в этом запросе есть ещё условие, которое требует дабавить эту группировку.
iif( (vk.Date_vk_fact>=vk.Date_vk),"*"," ") as priz,


 
Ega23 ©   (2010-01-12 14:54) [21]


> но у меня в этом запросе есть ещё условие, которое требует
> дабавить эту группировку.


Учись формулировать вопросы. На твой изначальный вопрос тебе ответили.


 
Плохиш ©   (2010-01-12 15:02) [22]


> Mery   (12.01.10 14:47) [20]

Расскажите, что-такое по вашему группировка (group by) и для чего она нужна.


 
Mery   (2010-01-12 19:25) [23]

>Плохиш ©   (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). вот и весь вопрос.


 
Ega23 ©   (2010-01-12 19:41) [24]


> это типа прикол?


судя по всему - нет.

Поясняю:
Предположим, у тебя всего 1 человек. У него - 100 покупок, начиная с 1 января и так каждый день в течении 100 дней.
Предположим, что vk.Date_vk_fact = 101.
Что ты хочешь увидеть в выборке?


 
turbouser ©   (2010-01-12 20:21) [25]

Давно уже с fb плотно не работал, но он по моему со 2-й (или даже с 1.5) позволяет группировать по ф-циям, так шта конструкцию iif( (vk.Date_vk_fact>=vk.Date_vk),"*"," ")  наверняка можно воткнуть в группировку



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

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

Наверх




Память: 0.53 MB
Время: 0.014 c
15-1261813347
All
2009-12-26 10:42
2010.03.14
Нарезать болванку..


1-1233316055
alexvan
2009-01-30 14:47
2010.03.14
Вопрос по работе компонента TDBGrid


15-1261953438
Делфиец
2009-12-28 01:37
2010.03.14
Хочу давно "О чем не пишут в книгах по Delphi" почитать


15-1261912044
12
2009-12-27 14:07
2010.03.14
настрочил наболевшее


2-1263033548
THint
2010-01-09 13:39
2010.03.14
Вывести Hint