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

Откуда:
Сообщений: 161
Хочу посчитать показатель накопительным итогом. + три его составляющие VINT (1...3)

sp.d$date_day - таблица с эталонными датами, чтобы не допускать пропусков.

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

Переделал по самоучителю. Ругается на b.start_time

Что я не правильно делаю?

select  b.start_time,to_char(b.start_time, 'dd.mm.yyyy') full_date, sum(nvl( b.amount_rur,0)) as kolvo, 
sum(case when (ci=1) then nvl(b.amount_rur,0) end) VINT1,
sum(case when (ci=2) then nvl(b.amount_rur,0) end) VINT2,
sum(case when (ci=3) then nvl(b.amount_rur,0) end) VINT3,


(with dts as ( 
  select/*+ materialize */ distinct trunc(full_date ,'DD') full_date 
  from sp.d$date_day 
  where full_date>=to_date('01.01.2011','dd.mm.yyyy') and 
        full_date<=to_date('05.01.2012','dd.mm.yyyy'))
        
,a as (
  select 
       sum(nvl(amount_rur,0)) kolvo, trunc(start_time,'DD') as full_date ,nvl(ci,0) ci
from  sp.cost a 
       where a.start_time<b.start_time --<<<<<РУГАЕТСЯ ТУТ
group by start_time,ci )

select
trunc(dts.full_date,'DD') full_date,
sum(nvl(kolvo,0)) kolvo,
sum(case when (ci=1) then nvl(kolvo,0) end) VINT1,
sum(case when (ci=2) then nvl(kolvo,0) end) VINT2,
sum(case when (ci=3) then nvl(kolvo,0) end) VINT3

from dts left join a on (dts.full_date=a.full_date)
group by trunc(dts.full_date,'DD') ) a 

from sp.cost b
      where start_time>=to_date('01.01.2011','dd.mm.yyyy') and 
          start_time<to_date('05.01.2012','dd.mm.yyyy') 

group by b.start_time, to_char(b.start_time, 'dd.mm.yyyy') 
order by 1

-------------------------------
--брал пример за это http://www.sql-tutorial.ru/ru/book_running_totals.html

SELECT date, SUM(out) out, 
(SELECT SUM(out)   FROM Outcome_o   WHERE date <= o.date) run_tot 
FROM Outcome_o o
GROUP BY date
ORDER BY date
14 фев 12, 13:46    [12088332]     Ответить | Цитировать Сообщить модератору
 Re: SQL Подсчет с накопительным итогом  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Freeze729,
и что непотяного?))) в запросе нет альяса b., откуда бы ему там взяться если Вы его не прописали.
зы.и нет у меня состовляющих))
14 фев 12, 13:54    [12088449]     Ответить | Цитировать Сообщить модератору
 Re: SQL Подсчет с накопительным итогом  [new]
Freeze729
Member

Откуда:
Сообщений: 161
Получается в примере из туториала баг чтоли?
Я ж по сути тоже самое делаю.
Вы про алиас то верно сказали, только вектор куда идти не нахожу.
Когда циклишься в своих же ошибках, то мыслишь в рамках чего-то. Вот не найду выход.
14 фев 12, 14:02    [12088542]     Ответить | Цитировать Сообщить модератору
 Re: SQL Подсчет с накопительным итогом  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Freeze729,
начал писать с альясами пиши везде. и видимо ктото не догоняет основ. откуда в запросе:
select 
       sum(nvl(amount_rur,0)) kolvo, trunc(start_time,'DD') as full_date ,nvl(ci,0) ci
from  sp.cost a 
       where a.start_time<b.start_time --<<<<<РУГАЕТСЯ ТУТ
group by start_time,ci 

резко появится таблица b, если ты ее не указал в from ?
14 фев 12, 14:11    [12088667]     Ответить | Цитировать Сообщить модератору
 Re: SQL Подсчет с накопительным итогом  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Freeze729,
мда не сразу в твоей каше увидел в чем пробелма. нельзя пропихнуть b.start_time на 2 уровня вниз в оракле.
14 фев 12, 14:13    [12088693]     Ответить | Цитировать Сообщить модератору
 Re: SQL Подсчет с накопительным итогом  [new]
v323rs
Member

Откуда:
Сообщений: 76
Freeze729, а это один запрос или несколько ?

смущает в середине

(with dts as ( 
  select/*+ materialize */ distinct trunc(full_date ,'DD') full_date 
  from sp.d$date_day 
  where full_date>=to_date('01.01.2011','dd.mm.yyyy') and 
        full_date<=to_date('05.01.2012','dd.mm.yyyy'))
        
,a as (
  select 
       sum(nvl(amount_rur,0)) kolvo, trunc(start_time,'DD') as full_date ,nvl(ci,0) ci
from  sp.cost a 
       where a.start_time<b.start_time --<<<<<РУГАЕТСЯ ТУТ
group by start_time,ci )

select
trunc(dts.full_date,'DD') full_date,
sum(nvl(kolvo,0)) kolvo,
sum(case when (ci=1) then nvl(kolvo,0) end) VINT1,
sum(case when (ci=2) then nvl(kolvo,0) end) VINT2,
sum(case when (ci=3) then nvl(kolvo,0) end) VINT3

from dts left join a on (dts.full_date=a.full_date)
group by trunc(dts.full_date,'DD') ) a 


(SELECT SUM(out)   FROM Outcome_o   WHERE date <= o.date) run_tot
это вычисляемая ОДНА колонка
14 фев 12, 14:43    [12089056]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить