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

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

запрос на SQL [MSSQL]


Draught ©   (2005-10-28 17:15:00) 

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

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

Есть файл с таблицей в которой записаны люди, их вклады и даты вкладов.
Надо написать запрос результатом которого будут все имена людей, их последний вклад в 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


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


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


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

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


Fay   (2005-10-29 13:37:00) [2]

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

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


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

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

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


stud   (2005-10-28 19:05:00) [4]

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


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

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


stud   (2005-10-28 18:50:00) [6]


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

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


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

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


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


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


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

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)


stud   (2005-10-28 18:13:00) [9]

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


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

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


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

2ABN

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


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

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

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


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

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

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

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


ANB   (2005-10-28 17:52:00) [14]


> Apachi   (28.10.05 17:46) [6]


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

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


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

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

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

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


Desdechado   (2005-10-28 17:43:00) [16]

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

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


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

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


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

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

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


ANB   (2005-10-28 17:30:00) [19]

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


Fay   (2005-10-28 17:28:00) [20]

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


Наверх

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