![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
запрос на 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 ?