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

Откуда:
Сообщений: 161
Здравствуйте господа.
Нужно получить приход товара за период (например сегодня -365 дней) с разбивкой по месяцам.
Есть вот такой запрос:
select z_month.x_month,nvl(sum(dc.quantity),0) as summa from doccontents dc,doctitles d,
(select add_months(trunc(sysdate-365,'mon'),level-1) as x_month
  from dual
connect by level <=13 order by 1) z_month
where dc.DOCID=d.ID and d.TYPEID=1
and dc.GOODSID=113898
and z_month.x_month=trunc(d.DOCDATE,'month')
group by z_month.x_month
order by 1 
  

Который выводит
ДАТАСУММА
01.01.2012700
01.02.2012500
01.03.2012800
01.05.20121000
01.06.2012500
01.07.2012500
01.08.2012500
01.09.2012600
01.10.20121000
01.11.2012500
01.12.2012500

Как бы все ок, НО если присмотреться, то видно что в 4 месяце - когда прихода не было - строчка не выводится, а хотелось чтобы вывело 0
ДАТАСУММА
..........
01.03.2012800
01.04.20120
01.05.20121000
.............

Помогите переделать запрос.
p.s.
and z_month.x_month=trunc(d.DOCDATE,'month')(+)
не работает
22 янв 13, 17:58    [13811345]     Ответить | Цитировать Сообщить модератору
 Re: Пропущенный месяц  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
Green Color
p.s.
and z_month.x_month=trunc(d.DOCDATE,'month')(+)
не работает

z_month.x_month=trunc(d.DOCDATE(+),'month')
22 янв 13, 18:12    [13811431]     Ответить | Цитировать Сообщить модератору
 Re: Пропущенный месяц  [new]
Green Color
Member

Откуда:
Сообщений: 161
Zloxa
z_month.x_month=trunc(d.DOCDATE(+),'month')

Увы - результат тот же.
22 янв 13, 18:15    [13811451]     Ответить | Цитировать Сообщить модератору
 Re: Пропущенный месяц  [new]
Vint
Member

Откуда: Москва
Сообщений: 4564
Zloxa,
dc.DOCID=d.ID and d.TYPEID=1 не заметил?)
22 янв 13, 18:20    [13811483]     Ответить | Цитировать Сообщить модератору
 Re: Пропущенный месяц  [new]
Zloxa
Member

Откуда: СССР ☭
Сообщений: 1033
Green Color
Zloxa
z_month.x_month=trunc(d.DOCDATE(+),'month')

Увы - результат тот же.

Тот-же это какой - ошибка?

Ну а так вобще, да, смотри коментарий Vint, плюсики надо ставить не только здесь.
22 янв 13, 18:27    [13811530]     Ответить | Цитировать Сообщить модератору
 Re: Пропущенный месяц  [new]
Green Color
Member

Откуда:
Сообщений: 161
Zloxa
Green Color
пропущено...

Увы - результат тот же.

Тот-же это какой - ошибка?

Ну а так вобще, да, смотри коментарий Vint, плюсики надо ставить не только здесь.


Результат - 4-й месяц не показывается.
По комментарию Vint - он тут не подходит: doctitles (шапка приходного документа), doccontents (содержимое прихода - ВСЕГДА есть значения), d.TYPEID=1 (тип документа - приход)
22 янв 13, 18:32    [13811571]     Ответить | Цитировать Сообщить модератору
 Re: Пропущенный месяц  [new]
juras
Member

Откуда: Прага
Сообщений: 257
Green Color
Zloxa
пропущено...

Тот-же это какой - ошибка?

Ну а так вобще, да, смотри коментарий Vint, плюсики надо ставить не только здесь.


Результат - 4-й месяц не показывается.
По комментарию Vint - он тут не подходит: doctitles (шапка приходного документа), doccontents (содержимое прихода - ВСЕГДА есть значения), d.TYPEID=1 (тип документа - приход)


Подходит, только лучше через субквери

with doc as
(select 
trunc(d.DOCDATE(+),'month') as doc_month,
...
* 
from doccontents dc,doctitles d
where 
<Ваше условие соединения таблиц>
dc.DOCID=d.ID 
and d.TYPEID=1
and dc.GOODSID =113898),
z_month as
(select add_months(trunc(sysdate-365,'mon'),level-1) as x_month
  from dual
connect by level <=13 order by 1)
select z_month.x_month,nvl(sum(doc.quantity),0) as summa 
from doc, z_month
and z_month.x_month=doc.doc_month(+)
group by z_month.x_month
order by 1 
22 янв 13, 18:47    [13811659]     Ответить | Цитировать Сообщить модератору
 Re: Пропущенный месяц  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
select  z_month.x_month,
        nvl(sum(t.quantity),0) as summa
  from  (
         select  trunc(d.DOCDATE,'month') x_month,
                 dc.quantity
           from  doccontents dc,
                 doctitles d
           where dc.DOCID = d.ID
             and d.TYPEID = 1
             and dc.GOODSID = 113898
        ) t,
        (
         select  add_months(trunc(sysdate-365,'mon'),level-1) as x_month
           from  dual
           connect by level <= 13
        ) z_month
  where z_month.x_month = t.x_month(+)
  group by z_month.x_month
  order by 1
/


SY.
22 янв 13, 18:49    [13811678]     Ответить | Цитировать Сообщить модератору
 Re: Пропущенный месяц  [new]
Green Color
Member

Откуда:
Сообщений: 161
SY,
У меня почти такой же запрос:

select x_month,nvl(summa,0) from 
(select add_months(trunc(sysdate-365,'mon'),level-1) as x_month
  from dual
connect by level <=13 order by 1) z,
(select trunc(d.DOCDATE,'month') as datex,nvl(sum(dc.quantity),0) as summa from doccontents dc,doctitles d
where dc.DOCID=d.ID and d.TYPEID=1 and dc.GOODSID=113898  group by trunc(d.DOCDATE,'month') ) zx
where z.x_month=zx.datex(+)
order by 1 
 


Результат тот что и требовалось (Ваш запрос тоже сработал), но проблема в том что идет полный перебор
таблицы doccontents и doctitles так как не ограничен временной диапазон - в результате запрос работает более 3 секунд - очень долго.
22 янв 13, 19:00    [13811743]     Ответить | Цитировать Сообщить модератору
 Re: Пропущенный месяц  [new]
Green Color
Member

Откуда:
Сообщений: 161
select x_month,nvl(summa,0) from 
(select add_months(trunc(sysdate-365,'mon'),level-1) as x_month
  from dual
connect by level <=13 order by 1) z,
(select trunc(d.DOCDATE,'month') as datex,nvl(sum(dc.quantity),0) as summa from doccontents dc,doctitles d
where dc.DOCID=d.ID and d.TYPEID=1 and dc.GOODSID=113898 and d.docdate>=sysdate-365  group by trunc(d.DOCDATE,'month') ) zx

where z.x_month=zx.datex(+)
order by 1 
  

Переделал - все еще долго работатет - полный проход по таблице doccontents
22 янв 13, 19:04    [13811763]     Ответить | Цитировать Сообщить модератору
 Re: Пропущенный месяц  [new]
Green Color
Member

Откуда:
Сообщений: 161
Выполнил запрос
select trunc(d.DOCDATE,'month') as datex,nvl(sum(dc.quantity),0) as summa from doctitles d,doccontents dc
where d.ID=dc.DOCID and d.TYPEID=1 and dc.GOODSID=113898 and d.docdate between sysdate-365 and sysdate  group by trunc(d.DOCDATE,'month')


почему то идет полный перебор все таблицы doccontents. Вот оно узкое место
22 янв 13, 19:07    [13811780]     Ответить | Цитировать Сообщить модератору
 Re: Пропущенный месяц  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 10045
Green Color
Переделал - все еще долго работатет - полный проход по таблице doccontents


План покажи.

SY.
22 янв 13, 19:08    [13811784]     Ответить | Цитировать Сообщить модератору
 Re: Пропущенный месяц  [new]
Green Color
Member

Откуда:
Сообщений: 161
Просто какие то чудеса, поменял ID позиции
и уже запрос
select x_month,nvl(summa,0) from 
(select add_months(trunc(sysdate-365,'mon'),level-1) as x_month
  from dual
connect by level <=13 order by 1) z,
(select trunc(d.DOCDATE,'month') as datex,nvl(sum(dc.quantity),0) as summa from doccontents dc,doctitles d
where dc.DOCID=d.ID and d.TYPEID=1 and dc.GOODSID=788 and d.docdate between sysdate-365 and sysdate  group by trunc(d.DOCDATE,'month') ) zx

where z.x_month=zx.datex(+)
order by 1 
  

генерирует такой план

К сообщению приложен файл. Размер - 22Kb
22 янв 13, 19:18    [13811829]     Ответить | Цитировать Сообщить модератору
 Re: Пропущенный месяц  [new]
Green Color
Member

Откуда:
Сообщений: 161
Zloxa, juras, SY

Большое всем спасибо. Тема закрыта.
22 янв 13, 19:22    [13811866]     Ответить | Цитировать Сообщить модератору
 Re: Пропущенный месяц  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Green Color
Просто какие то чудеса, поменял ID позиции
и уже запрос
select x_month,nvl(summa,0) from 
(select add_months(  trunc(sysdate-365,'mon') ,level-1) as x_month
  from dual
connect by level <=13 order by 1) z,
(select trunc(d.DOCDATE,'month') as datex,nvl(sum(dc.quantity),0) as summa from doccontents dc,doctitles d
where dc.DOCID=d.ID and d.TYPEID=1 and dc.GOODSID=788 and d.docdate between  sysdate-365  and sysdate  group by trunc(d.DOCDATE,'month') ) zx

where z.x_month=zx.datex(+)
order by 1 
  

генерирует такой план

не в смысле плана, однако, неувязачка, имхо
22 янв 13, 19:33    [13811929]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить