Форум программистов, компьютерный форум, киберфорум
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 01.06.2015
Сообщений: 3

Запрос с вычисляемыми условиями

01.06.2015, 11:35. Показов 2222. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!

Новичок в SQL, помогите решить задачу. Даны 2 таблицы: @T1 (Id – ID клиента, Credit – размер кредита), @T2 (Id – ID клиента, Sum – сумма покупки, Date – дата покупки, Name - наименование покупки). Необходимо написать запрос, результатом которого будет таблица с покупками всех клиентов, отсортированная в обратном хронологическом порядке. В этой таблице должны отобразиться только те покупки, на которые хватит кредита. Причем, в последней строке для каждого клиента должна быть указана не сумма покупки, а остаток кредита.

Т.е. если в первую таблицу внести строку (1, 24), а во вторую таблицу добавить записи, например:
1, 5, '10.24.2005', 'хлеб'
1, 9, '10.19.2005', 'молоко'
1, 3, '10.22.2005', 'гречка'
1, 8, '10.04.2005', 'колбаса'
1, 6, '10.18.2005', 'огурец'
1, 5, '09.29.2005', 'холодец'
2,....

То в результате должно получиться следующее:
1 2005-10-24 00:00:00 5.00 хлеб
1 2005-10-22 00:00:00 3.00 гречка
1 2005-10-19 00:00:00 9.00 молоко
1 2005-10-18 00:00:00 6.00 огурец
1 2005-10-04 00:00:00 1.00 колбаса
2 ....
и далее строки по следующим клиентам.

Сам решил через использование двух курсоров (один вложен в другой), но выполняется запрос долго. Да и как-то громоздко очень. Будто чешу правое ухо левой пяткой. Чую, что можно много оптимальнее сделать, а базы нет, поэтому понять как не могу. Подскажите, как можно сделать или хотя бы в какую сторону думать?
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.06.2015, 11:35
Ответы с готовыми решениями:

Запрос на выборку с условиями
Имеется 2 таблицы: 1ая "Записи на прием", где столбцы: Клиент, дата, id _время 2ая "Время записи", где столбцы: id_время,...

Запрос с условиями в Where и Order By
Ребята, подскажите, пожалуйста. Отказывается работать: Суть того, чего я хочу, проста: мне надо чтобы некоторые условия фильтрации и...

Запрос с условиями по выводу значений
Всем доброе утро. Что-то не соображу, что не так...... Есть запрос select * from table where .... Значения в таблицах разного формата,...

4
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
01.06.2015, 12:31
Цитата Сообщение от griv89 Посмотреть сообщение
как можно сделать или хотя бы в какую сторону думать?
Стандартная задача на нарастающий итог, он же running total. Способы реализации зависят от версии сервера.
1
0 / 0 / 0
Регистрация: 01.06.2015
Сообщений: 3
02.06.2015, 08:37  [ТС]
Цитата Сообщение от invm Посмотреть сообщение
Стандартная задача на нарастающий итог, он же running total. Способы реализации зависят от версии сервера.
Просмотрел про нарастающий итог информацию. В принципе более-менее понятно. Не очень понимаю как сделать следующее:
Цитата Сообщение от griv89 Посмотреть сообщение
в последней строке для каждого клиента должна быть указана не сумма покупки, а остаток кредита.
Работаю в SQL Server 2008.
0
3614 / 2135 / 756
Регистрация: 02.06.2013
Сообщений: 5,169
02.06.2015, 10:55
Лучший ответ Сообщение было отмечено Metall_Version как решение

Решение

T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
set dateformat mdy;
 
declare @t1 table (id int, credit numeric(18,2));
insert into @t1
values
 (1, 24);
 
declare @t2 table (id int, s numeric(18,2), dt datetime, name varchar(50));
insert into @t2
values
 (1, 5, '10.24.2005', 'хлеб'),
 (1, 9, '10.19.2005', 'молоко'),
 (1, 3, '10.22.2005', 'гречка'),
 (1, 8, '10.04.2005', 'колбаса'),
 (1, 6, '10.18.2005', 'огурец'),
 (1, 5, '09.29.2005', 'холодец');
 
select
 b.id, b.dt,
 case when a.credit >= c.s then b.s else d.cr end,
 b.name
from
 @t1 a join
 @t2 b on b.id = a.id cross apply
 (select sum(s) from @t2 where id = b.id and dt >= b.dt) c(s) cross apply
 (select a.credit - (c.s - b.s)) as d(cr)
where
 d.cr >= 0
order by
 b.id, b.dt desc;
1
0 / 0 / 0
Регистрация: 01.06.2015
Сообщений: 3
02.06.2015, 11:00  [ТС]
Огромное спасибо, буду разбираться!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.06.2015, 11:00
Помогаю со студенческими работами здесь

Сложный вложенный запрос с несколькими условиями
У меня есть БД, в которой 3 таблицы `seller`, `buyer`, `orders`; Структуры таблиц на приложенном скриншоте. Мне необходимо составить...

Как правильно выглядит запрос с двумя и более условиями?
Имеется SELECT TIN FROM dbo.Organization_Table WHERE ID_Organization = n необходимо сотворить что-то вроде такого SELECT TIN FROM...

Расширенный фильтр с вычисляемыми условиями
Всем доброго времени суток! Помогите, пожалуйста, решить задачу, кучу всего уже перечитал по этой теме. Уже голову сломал, но никак не...

Запрос с вычисляемыми полями
Здравствуйте, столкнулся с проблемкой в Access2007: запрос с вычисляемым полем которое отображает сумму записей в связанной таблице не...

Запрос с вычисляемыми полями
Здравствуйте, помогите исправить ошибку в запросе. SELECT Клиенты., Клиенты., Клиенты.Адрес, Клиенты.Телефон, Клиенты., ., ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru