Re: sql query

From
Vladimir Begun ()
To
Vladimir Kochnev ()
Date
2002-07-12T09:40:14Z
Area
RU.DBMS.ORACLE
From: Vladimir Begun <vladimir.begun@oracle.com>


Это один из многих вариантов, он чем-то лучше, чем-то
хуже остальных. Надеюсь, что набил без ошибок, не проверял.

SELECT /*+ USE_HASH(c_b, balance) */
       c_b.id
     , c_b.name
     , balance.summa
     , balance.data
  FROM (
       SELECT client.id id
            , client.name name
            , MAX(data) dt
         FROM ostatki balance
            , klients client
        WHERE balance.data <= TRUNC(SYSDATE)
          AND client.id = balance.id
        GROUP BY
              client.id
            , client.name
       ) c_b
     , ostatki balance
 WHERE balance.id = c_b.id
   AND balance.data = c_b.dt
/
-- 
Vladimir Begun               | The statements and opinions expressed
http://vbegun.net/           | here are my own and do not necessarily
http://vbegun.net/wap/       | represent those of Oracle Corporation.
me@vbegun.net                |
ICQ#19259480/30% reachability|

Vladimir Kochnev wrote:
> 
> "Andrei Romazanov" <romazanov.andrei@gfos.de> сообщил/сообщила в новостях
> следующее: news:agjpu7$m3l3f$1@ID-70985.news.dfncis.de...
> > "Vladimir Kochnev" <kochnev@amet.ru> schrieb im Newsbeitrag
> > news:agisfg$p9o$1@host.talk.ru...
> > > "Бойко Вадим" <vadim@profit.iks.ru> сообщил/сообщила в новостях
> следующее:
> > > news:3d2ce991$1@news.iks.ru...
> > > > Многоуважаемые, помогите, голова уже опухла.
> > > >
> > > > Oracle 8.1.7
> > > > есть таблицы klients (id, name) и
> > > > ostatki (id, data, summa), в которой остатки
> > > > по клиенту есть не за каждый день
> > > >
> > > > надо выбрать по всем клиентам остатки
> > > > за определенный день,
> > > > но если за эту дату у клиента нет данных,
> > > > то взять за предыдущую дату (которая может быть
> > > > любая, хоть год назад)
> > >
> > > select k.id,k.name,o.summa from ostatki o,klients k
> > > where o.id=k.id and o.date=(select max(date) from ostatki where id=o.id
> > and
> > > date<=нужная дата)
> > >
> >
> > eto vrode bi ne sovsem to chto trebovalos'. Ja bi skasal:
> >
> > select k.id,k.name,o.summa from ostatki o,klients k
> > where o.id=k.id and o.date=нужная дата
> > union
> > select k.id,k.name,o.summa from ostatki o,klients k
> > where o.id=k.id and o.date=(select max(date) from ostatki where id=o.id
> and
> > date<=нужная дата) and not exists
> > (select 1 from ostatki where id=k.id and date=нужная дата)
> >
> По правде говоря не заметил особой разницы. Но в вашем варианте тогда надо
> date<=нужная дата
> заменить на date<нужная дата.
> 
> PS: Пусть хозяин вопроса скажет, что правильно.
> Владимир Кочнев


Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
 * Origin: Talk.Mail.Ru (2:5020/400)
SEEN-BY: 50/520 523 993 51/7 450/102 159 452/25 461/33 43 640 463/220 257
SEEN-BY: 464/34 36 465/204 466/20 467/70 95 469/125 999 550/5068 4615/21
SEEN-BY: 4623/55 4625/8 9 4626/6 4631/13 4641/444 4643/19 4653/10 4657/50
SEEN-BY: 5000/44 76 5000 5001/27 77 211 5002/5002 5003/9 34 5004/16 5005/44
SEEN-BY: 5006/1 5007/1 5009/9 5010/70 77 222 5011/13 5012/1 5015/4 28
SEEN-BY: 5019/22 28 5020/20 37 52 52 69 79 104 114 115 118 128 150 175 194
SEEN-BY: 5020/238 238 348 362 392 400 400 496 642 647 732 753 758 760 768
SEEN-BY: 5020/870 902 921 982 1057 1100 1169 1200 1212 1234 1301 1423 1535
SEEN-BY: 5020/1626 1642 1694 1873 1930 1951 2013 2020 2200 3637 4400 4441
SEEN-BY: 5021/3 29 5022/5 5023/11 5024/11 5025/3 5026/14 45 78 5028/51
SEEN-BY: 5029/1 50 5030/115 175 195 251 382 448 613 757 920 953 1016 1023
SEEN-BY: 5030/1400 1900 5031/26 5032/6 16 5033/1 5034/1 5035/10 5036/1 13
SEEN-BY: 5037/21 5038/7 5040/33 47 5041/4 5042/8 5045/7 42 5049/1 64 125
SEEN-BY: 5050/9 5051/15 35 5052/4 5053/16 18 777 5054/1 9 10 30 37 50 79
SEEN-BY: 5056/16 5057/1 5058/24 1000 5059/10 5060/88 90 5061/6 15 5063/27 60
SEEN-BY: 5064/5 7 35 36 5066/18 5069/128 5070/26 66 5071/1 5075/10 5077/3
SEEN-BY: 5078/20 5079/36 45 49 5080/80 111 301 1003 5081/2 3 5082/6 5083/13
SEEN-BY: 5083/21 5085/13 75 5090/2 91 1029 5091/100 5093/27 5095/1 5100/8
SEEN-BY: 5100/113 6009/8 6023/1 6028/1 6035/1 6037/1 6083/1
PATH: 5020/400 238 52 5054/1 79