Форум: "Начинающим";
Текущий архив: 2010.03.14;
Скачать: [xml.tar.bz2];
ВнизСложность в построении запроса Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.006 c