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

Откуда: Vladivostok
Сообщений: 33
есть 3 таблички clients, accounts, ostatok. Первая со второй связаны по столбцу ID_client, а вторая с третей по столбцу ID_account.
в таблице ostatok введутся изменения на счету по дате, причем если в в определенную дату изменений не было то в таблицу ничего не записывается, в таблице есть date_1 - дата изменения и date_2 - дата предыдущего изменения.

мне надо вывести все остатки по счетам клиентов на вводимую дату:

declare @date datetime
set @date = '02.07.2012'
select * from clients, oaccounts, ostatok where clients.id_client = accounts.id_client
and accounts.id_account = ostatok.id_account and ostatok.saldo>0 and ostatok.date_2=@date

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

как сделать что бы он показывал остаток на вводимую дату ВСЕХ клиентов?

буду признателен за вашу помощь, заранее спасибо.
3 июл 12, 03:11    [12807332]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
GloryV
Member

Откуда:
Сообщений: 33
aksuz
declare @date datetime
set @date = '02.07.2012'
select * from clients, oaccounts, ostatok where clients.id_client = accounts.id_client
and accounts.id_account = ostatok.id_account and ostatok.saldo >= 0 and ostatok.date_2=@date

а так!?
3 июл 12, 05:15    [12807386]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
GloryV
Member

Откуда:
Сообщений: 33
aksuz
declare @date datetime
set @date = '02.07.2012'
select * from clients, oaccounts, ostatok where clients.id_client >= accounts.id_client
and accounts.id_account >= ostatok.id_account and ostatok.saldo >= 0 and ostatok.date_2=@date

и так..
3 июл 12, 05:18    [12807388]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
aksuz
Member

Откуда: Vladivostok
Сообщений: 33
Первый вариант такой же как и я написал же, saldo - это баланс счета - от того что он >0 или >=0 добавляются тока клиенты у кого на балансе 0. В это варианте запрос выдает тока тех клиентов у кого были изменения на счету в @date
допустим у меня вчера изменялся баланс а запрос сделан на сегодняшнюю дату и меня не будет в запросе хотя у меня положительный баланс.

А во втором варианте запрос хз че делает - бесконечно выдает все изменения по счету всех клиентов - а мне надо только последние изменение до введеной даты....
3 июл 12, 08:29    [12807515]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
тест ер
Guest
aksuz,

вы бы хоть пример таблиц написали с данными и что надо получить на выходе. А то так гадать можно до бескоонечности, что именно вам надо.
3 июл 12, 08:36    [12807535]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
тест ер
Guest
aksuz,

может так:
select c.id_client, isnull(o.saldo, 0)
from
  clients c
  inner join accounts a on c.id_client = a.id_client
  left join ostatok o on a.id_account = o.id_account
where
  o.date_2 <= @date 
  and o.saldo > 0


а может и нет...
данные давайте.
3 июл 12, 08:41    [12807545]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
GloryV
Member

Откуда:
Сообщений: 33
aksuz
а мне надо только последние изменение до введеной даты....

MAX(TimeDate)
3 июл 12, 08:42    [12807547]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
aksuz
Member

Откуда: Vladivostok
Сообщений: 33
тока начал SQL изучать - щас попробую)
clients:
ID_client
1 1 1 0 БЭНКИС
2 1 1 0 ТУНКУР
3 1 1 0 МИКСТ
4 1 1 0 СКАЛЭСС
6 1 1 0 БАККАРА
7 1 1 0 ВИЗАВИ
accounts:
id_account id_client
65 40702 32
66 40702 13
67 40702 26
68 40702 7
69 40702 10
70 40702 23
71 40702 36
72 40702 4
ostatok:
ID_account date_2 saldo date_1
49182 2011-03-17 00:00:00.000 17001,95 1181,60 2011-03-21 00:00:00.000
49182 2011-03-21 00:00:00.000 4001,95 13000,00 2011-03-22 00:00:00.000
49182 2011-03-22 00:00:00.000 1,95 4000,00 2011-03-23 00:00:00.000
49182 2011-03-23 00:00:00.000 5501,95 0,00 2011-03-29 00:00:00.000
7 2000-07-05 00:00:00.000 -4290,00 2000-07-06 00:00:00.000
13 2000-07-05 00:00:00.000 0,00 24000,00 2000-07-10 00:00:00.000


вот куски из таблиц... =\
3 июл 12, 08:55    [12807595]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
aksuz
Member

Откуда: Vladivostok
Сообщений: 33
ой бл* - в ообщении они лучше смотрелись
3 июл 12, 08:56    [12807597]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
тест ер
Guest
aksuz
ой бл* - в ообщении они лучше смотрелись

во-первых, в ваших кусках из таблиц все таблицы не связаны между собой по id
во-вторых, напишите скрипт создания таблиц create... и потом скрипт заполнения таблиц тестовыми данными insert... и не надо присылать никаких кусков.
Создание таблиц напишу за вас:
declare @clients table (ID_client int, name nvarchar(100))
declare @accounts table (id_account int, ID_client int)
declare @ostatok table (ID_account int, date_1 date, date_2 date, saldo money)

этого достаточно. Заполните их данными и потом задайте вопрос.
3 июл 12, 09:08    [12807649]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
aksuz
Member

Откуда: Vladivostok
Сообщений: 33
если бы я знал как их заполнить еще))) щас поковыряюсь. в кусках не связаны так как я сделал запросы Select * from из 3х таблиц и просто скопировал Из результата данные ...
3 июл 12, 09:39    [12807747]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
тест ер
Guest
aksuz
если бы я знал как их заполнить еще))) щас поковыряюсь. в кусках не связаны так как я сделал запросы Select * from из 3х таблиц и просто скопировал Из результата данные ...


вот так надо?
declare @clients table (ID_client int, name nvarchar(100))
declare @ostatok table (ID_client int, date_1 date, saldo money)


insert @clients values (1, 'БЭНКИС')
insert @clients values (2, 'ТУНКУР')
insert @clients values (3, 'МИКСТ')
insert @clients values (4, 'СКАЛЭСС')
insert @clients values (6, 'БАККАРА')
insert @clients values (7, 'ВИЗАВИ')


insert @ostatok values (1, '20120615', 100)
insert @ostatok values (1, '20120629', 200)
insert @ostatok values (1, '20120701', 300)
insert @ostatok values (1, '20120702', 400)
insert @ostatok values (1, '20120703', 500)
insert @ostatok values (2, '20120605', 1000)
insert @ostatok values (3, '20120620', 2000)


declare @date datetime
set @date = '20120605'



select c.id_client, c.[name], max(isnull(o.saldo, 0)), max(o.date_1)
from
  @clients c
  left join @ostatok o on c.id_client = o.id_client
where
  o.date_1 <= @date
group by c.id_client, c.[name]
having max(o.date_1) is not null


таблицу accounts выкинул, потому что для понимания она не нужна. В реальном запросе прикрутите ее сами.
3 июл 12, 09:59    [12807806]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
aksuz
Member

Откуда: Vladivostok
Сообщений: 33
вроде да, очень вам признателен, щас буду разбираться в написаном вами . еще раз большое спасибо
3 июл 12, 10:10    [12807859]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
тест ер
Guest
aksuz,

чота я сам себя перемудрил.
having не нужен конечно же, надо написать inner join
3 июл 12, 10:14    [12807880]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
тест ер
Guest
select c.id_client, c.[name], max(isnull(o.saldo, 0)), max(o.date_1)
from
@clients c
inner join @ostatok o on c.id_client = o.id_client
where
o.date_1 <= @date
group by c.id_client, c.[name]
3 июл 12, 10:15    [12807890]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
aksuz
Member

Откуда: Vladivostok
Сообщений: 33
тест ер,

insert @ostatok values (1, '20120615', 100)
insert @ostatok values (1, '20120629', 200)
insert @ostatok values (1, '20120703', 300)
insert @ostatok values (1, '20120702', 400)
insert @ostatok values (1, '20120701', 500)
insert @ostatok values (2, '20120605', 1000)
insert @ostatok values (3, '20120620', 2000)


declare @date datetime
set @date = '20120703'


тока не совсем так =/ если ввести данные так - то запрос выдает 500 на остатке бенфиса а должен 300

=/
3 июл 12, 10:20    [12807942]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
aksuz
Member

Откуда: Vladivostok
Сообщений: 33
все , я разобрался, спасибо всем
3 июл 12, 10:54    [12808181]     Ответить | Цитировать Сообщить модератору
 Re: небольшой запрос  [new]
не тестер
Guest
aksuz,

на выбор

1:
select c.[name], t.d, o.saldo
from @clients c
inner join (select o.id_client, max(o.date_1) d
            from @ostatok o
            where o.date_1 <= @date
            group by o.id_client) t on c.id_client = t.id_client
inner join @ostatok o on t.id_client = o.id_client and t.d = o.date_1

2:
  ;with w (r, ID_client, date_1, saldo, name) 
  as (
  select row_number() over (partition by c.id_client order by o.date_1 desc) as r, c.ID_client, o.date_1, o.saldo, c.name 
  from @ostatok o
  inner join @clients c on o.id_client = c.id_client
  where o.date_1 <= @date
  )
  select name, date_1, saldo 
  from w
  where r = 1 
3 июл 12, 11:16    [12808422]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить