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

Вниз

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

 
Draught   (2005-10-28 17:15) [0]

Доброго времени суток!

В который раз обращаюсь за помощью, т.к. сам не справляюсь...

Есть файл с таблицей в которой записаны люди, их вклады и даты вкладов.
Надо написать запрос результатом которого будут все имена людей, их последний вклад в 2004 году и последний вклад в 2005.

Я смог сделать добиться вот этого:

select name, max(data)
from table1
where data between "2004-01-01" and "2004-12-31"
group by name

union

select name, max(data)
from table1
where data between "2005-01-01" and "2005-12-31"
group by name


как сюда прикрутить вклад???


 
Fay ©   (2005-10-28 17:28) [1]

2 Draught   (28.10.05 17:15)
1) Приведи структуру Table1
2) Зачем NAME в TABLE1 ?


 
ANB ©   (2005-10-28 17:30) [2]

накрутить сверху вложенный запрос с отбором по человеку и дате. Некошерно в такую таблицу класть имена людей.


 
Draught   (2005-10-28 17:40) [3]

Fay, не задавай глупых вопросов...

структура таблицы:
name - имя человека
data - дата вклада
vk - вклад (сумма в рублях)


 
Fay ©   (2005-10-28 17:42) [4]

2 Draught   (28.10.05 17:40) [3]
А primary key какой?!


 
Desdechado ©   (2005-10-28 17:43) [5]

1. UNION поубирает дубликаты, еслиони встретятся в его половинках
2. 2005-12-31 - это 0 часов этой даты. Т.е. те, кто под новый гд сделади вклад, не попадают в твои расчеты

PS хочу такую таблицу с данными по вкладам :)


 
Apachi   (2005-10-28 17:46) [6]

ABN ответ в принципе дал, но Мое мнение таково

Задачу нужно немного изменить
Потому что допустим в один день может быть несколько вкладов, и вот именно в последний день года, откуда потом серверу знать какую именно сумму брать, небходимо добавить уникальный ключь по дате, или добавить время и тоже сделать уникальный ключь дата+время

И полностю согласен с ANB поле NAME однозначно из этой таблицы надо убирать, ставь ссылку на справочник


 
ANB ©   (2005-10-28 17:52) [7]


> Apachi   (28.10.05 17:46) [6]


> сделать уникальный ключь дата+время

Проэктирование таблицы отвратное, задача логически не корректна. Посему ответ на свой вопрос автор получил. А вот делать такие ключи я бы поостерегся. Как раз в нашей рабочей базе такие ключи. Вот граблей то собираем.


 
Draught   (2005-10-28 17:56) [8]

2Fay - ключ как всегда ID - autoincrement

2Desdechado, дубликатов не должно быть... все-таки год разный, за подсказку по дате спасибо... исправлюсь...

по поводу вложенного запроса - хотя бы намекните как это прикрутить...


 
Draught   (2005-10-28 17:58) [9]

структура таблицы может измениться:

ID - key
NAME - уникальный номер человека
DATA - дата вклада (datetime)
VK - сумма


 
Apachi   (2005-10-28 18:02) [10]

2ABN

Клиента потом конечно писать тяжело под такую БД, но зато БД намного прочне :)


 
Fay ©   (2005-10-28 18:02) [11]

2 Draught   (28.10.05 17:58) [9]
Я бы выбрал другие имена полей.
Даже Field2 и Field3 лучше (здесь) чем NAME и DATA


 
stud ©   (2005-10-28 18:13) [12]

select contracts.client_id,  max(contracts.contract_date)
from contracts
group by client_id, substring((convert (varchar(10), contract_date,121)),1,4)
примерный запрос


 
Ольга   (2005-10-28 18:14) [13]


> как сюда прикрутить вклад???

select name, VK, DatePart(yyyy,data) as yyyy, max(data)
from table1
where  DatePart(yyyy,data)=2004 OR DatePart(yyyy,data)=2005
group by name, VK, DatePart(yyyy,data)


 
Draught   (2005-10-28 18:48) [14]

2Fay, какая разница как поля называются??? Если тебе нечего сказать, то лучше промолчать... (без обид)

2stud, в итоге то же самое, что и у меня, только год получен другим способом... при этом вклад так же и остался нетронутым ;)

2Ольга, вариант интересный, но появляется лишняя запись, т.к. группируется по имени и дополнительно по вкладам... :)

В итоге все-таки прикрутил дополнительный вид и все стало на свои места...

create view test
as
select
name as name_user,
max(data) as max_date
from table1
where data between "2004-01-01 00:00:00" and "2004-12-31 23:59:59"
group by name

union

select name, max(data)
from table1
where data between "2005-01-01 00:00:00" and "2005-12-31 23:59:59"
group by name

select table1.* from
table1
 inner join test on table1.name = test.name_user and table1.data = test.max_date


всем спасибо за помощь... если что, обязательно обращусь...


 
stud ©   (2005-10-28 18:50) [15]


> в итоге то же самое, что и у меня, только год получен
> другим способом... при этом вклад так же и остался
> нетронутым ;)

так в чем проблема добавить нужное поле в выборку и группировку???


 
Draught   (2005-10-28 18:58) [16]

2stud
дык добавить нужно было не дату, а вклад... это как бы разные вещи... дату я выбрал, сгруппировал по вкладчикам, оставалось только добавить к этим вкладчикам их вклады...


 
stud ©   (2005-10-28 19:05) [17]

погоди, у тебя есть
клиент, вклад, дата
выбираеш клиент, вклад, мах(дата) -
результат приведенного запроса - с группировкой по годам, клиентам, вкладам


 
Draught   (2005-10-28 19:09) [18]

2stud
если ты говоришь про свой запрос, то это далеко не так.. там даже нет вклада... если ты говоришь о каком-то другом запросе, то показал бы его ;)

Вариант выхода из этой ситуации я нашел всего 1 - создание дополнительного вида, если кто-то предложит другой - с удовольствием рассмотрю...


 
Fay ©   (2005-10-29 13:37) [19]

2 Draught   (28.10.05 18:48) [14]
>> какая разница как поля называются???
Для того, кто будет разбираться с твоей программой после тебя, разница есть.

>> Если тебе нечего сказать, то лучше промолчать... (без обид)
Ну и молчал бы


 
Ольга   (2005-10-29 15:00) [20]


> Вариант выхода из этой ситуации я нашел всего 1 - создание
> дополнительного вида

Вариантов выхода из вашей (простейшей) ситуации несколько. Вы нашли далеко не самый лучший.



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

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

Наверх




Память: 0.51 MB
Время: 0.055 c
1-1132585085
Officeman
2005-11-21 17:58
2005.12.18
ГЛЮКИ


2-1133175211
LionMen
2005-11-28 13:53
2005.12.18
Расшифровка файла


6-1118759871
Mac333
2005-06-14 18:37
2005.12.18
IdSMTP и TIdAttachment -> Content-Type: text/html -> text/plain ?


14-1133033373
Некто
2005-11-26 22:29
2005.12.18
Сетевые жёсткие диски


14-1133078119
ArtemESC
2005-11-27 10:55
2005.12.18
Обработчик прерываний