Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
15-1258652658
Копир
2009-11-19 20:44
2010.03.14
В России, наконец-то, отменена смертная казнь...


15-1261508714
chery
2009-12-22 22:05
2010.03.14
помогите пожалуйста написать программу в Delphi


2-1263457856
JohnKorsh
2010-01-14 11:30
2010.03.14
Лицензия на Delphi 7.


15-1260123757
Кто б сомневался
2009-12-06 21:22
2010.03.14
Как включить Drag n Drop в висте


2-1263127428
nordlink19
2010-01-10 15:43
2010.03.14
Рисование окружности в free pascal





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский