Форум: "Базы";
Текущий архив: 2005.12.18;
Скачать: [xml.tar.bz2];
Вниззапрос на 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.014 c