Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SQl запрос выбора должников  [new]
Vetal_beginner
Member

Откуда:
Сообщений: 5
Доброго времени суток!
Прошу вашей помощи т.к. уже все перерыл и ничего не нашел
Задача состоит в том, что есть 2-е таблицы "Uchenik (ID, Name)" и "Платежи (ID, UchenikID, Summa, PaymentDate)". Надо выбрать плательщиков кто не заплатил в определенный месяц, после мучений получился вот такой запрос:
SELECT
dbo.Uchenik.Name,
MAX(dbo.Payments.paymentdate) AS Max_paymentsdate
FROM
dbo.Uchenik
INNER JOIN dbo.Payments ON (dbo.Uchenik.ID = dbo.Payments.UchenikID)
GROUP BY
dbo.Uchenik.Name,
dbo.Payments.Summa

Но он выбирает последнюю дату платежа как поле Max_paymentsdate и не дает его использовать в конструкции WHERE. Пожалуйста помогите и не судите строго т.к. только начал изучать SQL
Спасибо!
13 сен 12, 10:16    [13155830]     Ответить | Цитировать Сообщить модератору
 Re: SQl запрос выбора должников  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
Vetal_beginner,

а нормально рассказать про задачу без SQL можно?
На первый взгляд нужна таблица-календарь или таблица с последовательными числами или что-то подобное.
Потому что вернуть месяц, за который платежей, а значит, и записей в таблице, не было, невозможно.
Правда, можно вернуть границы периодов, в которых отсутствуют платежи.
Вот я и говорю, уточните, что надо-то?
13 сен 12, 10:24    [13155879]     Ответить | Цитировать Сообщить модератору
 Re: SQl запрос выбора должников  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
select u.name
  from dbo.Uchenik u
where not exists ( select * from dbo.Payments p
                     where u.ID = p.UchenikID
                       and p.PaymentDate between [Дата старта срока оплаты] and [Дата окончания срока оплаты]
                 )

?
13 сен 12, 10:25    [13155888]     Ответить | Цитировать Сообщить модератору
 Re: SQl запрос выбора должников  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
Или имеется в виду, что задаётся некий месяц, а вернуть надо тех, для кого не существует записи в таблице платежей за этот месяц?

В таком случае переведите этот мой вопрос на английский язык - получится запрос.
13 сен 12, 10:26    [13155894]     Ответить | Цитировать Сообщить модератору
 Re: SQl запрос выбора должников  [new]
iap
Member

Откуда: Москва
Сообщений: 47105
Опа! Алексей уже перевёл!
13 сен 12, 10:27    [13155904]     Ответить | Цитировать Сообщить модератору
 Re: SQl запрос выбора должников  [new]
aleks2
Guest
select * from from dbo.Uchenik
where ID in (select ID from dbo.Uchenik
             except
             select UchenikID from dbo.Payments where PaymentDate between [Дата старта срока оплаты] and [Дата окончания срока оплаты]
            )
13 сен 12, 10:31    [13155937]     Ответить | Цитировать Сообщить модератору
 Re: SQl запрос выбора должников  [new]
Vetal_beginner
Member

Откуда:
Сообщений: 5
iap
Или имеется в виду, что задаётся некий месяц, а вернуть надо тех, для кого не существует записи в таблице платежей за этот месяц?

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


Совершенно верно, надо вернуть список плательщиков для которых не существуют записи о платеже в заданном месяце
13 сен 12, 11:48    [13156525]     Ответить | Цитировать Сообщить модератору
 Re: SQl запрос выбора должников  [new]
Vetal_beginner
Member

Откуда:
Сообщений: 5
Все большое спасибо за ответы!!!
Ну в общем решил проблему таким вот запросом:

SELECT
dbo.Uchenik.Name,
dbo.Klass.Name
FROM
dbo.Payments
INNER JOIN dbo.Uchenik ON (dbo.Payments.UchenikID = dbo.Uchenik.ID)
INNER JOIN dbo.Klass ON (dbo.Uchenik.KlassID = dbo.Klass.ID)
GROUP BY
dbo.Uchenik.Name,
dbo.Klass.Name
HAVING
MONTH(MAX(dbo.Payments.paymentdate)) <> MONTH('12.11.2012')

Вроде все получилось, увы не удалось запустить выше приведенные примеры разбираюсь что и как я не правильно сделал
13 сен 12, 22:12    [13161205]     Ответить | Цитировать Сообщить модератору
 Re: SQl запрос выбора должников  [new]
aleks2
Guest
Vetal_beginner
Все большое спасибо за ответы!!!
Ну в общем решил проблему таким вот запросом:

SELECT
dbo.Uchenik.Name,
dbo.Klass.Name
FROM
dbo.Payments
INNER JOIN dbo.Uchenik ON (dbo.Payments.UchenikID = dbo.Uchenik.ID)
INNER JOIN dbo.Klass ON (dbo.Uchenik.KlassID = dbo.Klass.ID)
GROUP BY
dbo.Uchenik.Name,
dbo.Klass.Name
HAVING
MONTH(MAX(dbo.Payments.paymentdate)) <> MONTH('12.11.2012')

Вроде все получилось, увы не удалось запустить выше приведенные примеры разбираюсь что и как я не правильно сделал

Абзац.
14 сен 12, 06:16    [13161758]     Ответить | Цитировать Сообщить модератору
 Re: SQl запрос выбора должников  [new]
Vetal_beginner
Member

Откуда:
Сообщений: 5
Понятно что абзац, но я начинающий приведенные выше запросы не хотели запускаться
Таблицы Payment(ID,UchenikID, PaymentDate, Summa) и Таблица Uchenik (Id, UchenikID)
7 окт 12, 20:49    [13281027]     Ответить | Цитировать Сообщить модератору
 Re: SQl запрос выбора должников  [new]
aleks2
Guest
Vetal_beginner
Понятно что абзац, но я начинающий приведенные выше запросы не хотели запускаться
Таблицы Payment(ID,UchenikID, PaymentDate, Summa) и Таблица Uchenik (Id, UchenikID)


Дык не надо скромничать, Гульчатай!
Личико, т.е. запрос, который не пожелел запускаться и сообщение об ошибке надо просто показать.
8 окт 12, 05:39    [13281978]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить