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

Откуда:
Сообщений: 192
не получается отладить запрос.Суть вот в чем
месяц разбивается на 3 декады.
Если выбранная дата попадает в 1-ю декаду (первые 10 дней),то мы делаем выборку только из 1-й декады.
Если выбранная дата попадает во 2-ю декаду(с 11 по 20 число),то выбирает данные из 2-х декад
Если выбранная дата попадает во 3-ю декаду (с 21 до конца месяца),то выбирает данные из 3-х декад
select 
case when (date BETWEEN '2012-08-01' AND '2012-08-10' ) then 
(SELECT DISTINCT kl FROM tab1 WHERE  date ='2012-08-08' and kk <>0 ) 
FROM tab1,
case when (date BETWEEN '2012-08-11' AND '2012-08-21' ) then 
((SELECT DISTINCT kl FROM tab1 WHERE  date  BETWEEN '2012-08-01'  AND '2012-08-10' and kk <>0 ) 
FROM tab1
UNION 
(SELECT DISTINCT kl FROM tab1 WHERE  date  BETWEEN '2012-08-11'  AND '2012-08-20' and kk <>0 ) 
FROM tab1 )
.........

здесь даже ошибку відает сервер.Что-то не так делаю и не пойму.Ошибка сдаже с одним case
20 авг 12, 00:29    [13034635]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом case  [new]
grey_narn
Member

Откуда: Алма-Ата, Казахстан
Сообщений: 178
moroz11,

date - зарезервированное слово же. Если у вас и впрямь так столбец называется, то а) соболезную б) пишите в двойных кавычках:

where "date" = 
20 авг 12, 01:23    [13034758]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом case  [new]
grey_narn
Member

Откуда: Алма-Ата, Казахстан
Сообщений: 178
moroz11,

ой, да у вас там весь запрос - это какой-то лютый феерический... Прям как мой первый ответ.
В общем, сформулируйте задачу пояснее.
20 авг 12, 01:29    [13034765]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом case  [new]
Гхостик
Guest
select distinct p.t, t.kl
from tab1 t
join (
  select 1 t, 1 d1, 10 d2 from dual
  union all
  select 2 t, 11 d1, 20 d2 from dual
  union all
  select 3 t, 21 d1, 31 d2 from dual
) p on extract(day from t.date) between p.d1 and p.d2
where
  t.kk <> 0 and
  1=1
20 авг 12, 08:50    [13034992]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом case  [new]
stax..
Guest
moroz11,

  1  with t as
  2  (select date '2012-08-02' dat from dual union all
  3   select date '2012-08-15' from dual union all
  4   select date '2012-08-27' from dual
  5  )
  6  ,dt as (select date '2012-08-21' d from dual)
  7  select * from t,dt where
  8             dat >= trunc(d,'mm')
  9      and dat< (case
 10                     when to_char(d,'dd')<=10 then trunc(d,'mm')+10
 11                     when to_char(d,'dd')<=20 then trunc(d,'mm')+20
 12                     else last_day(d)
 13*                   end )+1
SQL> /

DAT        D
---------- ----------
02.08.2012 21.08.2012
15.08.2012 21.08.2012
27.08.2012 21.08.2012

SQL>


ps
почему в плюсе нет бинд переменной типа date я непонима

.....
stax
20 авг 12, 09:30    [13035119]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом case  [new]
moroz11
Member

Откуда:
Сообщений: 192
месяц разбивается на 3 декады.

Дату $date выбираю из календаря
1) Если выбранная дата попадает в 1-ю декаду (первые 10 дней месяца ),то мы делаем выборку данных из таблицы с начала месяца по эту выбранную дату -
2) Если выбранная дата $date попадает во 2-ю декаду(с 11 по 20 число месяца ),то выбирает данные из 2-х декад,т.е. с начала месяца и по 10 число включительно + с 11-го числа и по выбранную дату $date .Данные 2-х декад я вывожу отдельно на экран.
3) Если выбранная дата попадает во 3-ю декаду (с 21 и до конца месяца),то выбирает данные из 3-х декад:
данные с 1- го по 10 число отдельно нужны мне-это 1 декада
данные с 11- го по 20 число отдельно нужны мне-это 2 декада
данные с 21- го по выбранную дату отдельно нужны мне-это 3 декада


select
case when ($date BETWEEN '2012-08-01' AND '2012-08-10' ) then
(SELECT DISTINCT kl FROM tab1 WHERE date ='".$date."')
FROM tab1,
case when ($date BETWEEN '2012-08-11' AND '2012-08-21' ) then
((SELECT DISTINCT kl FROM tab1 WHERE date BETWEEN '2012-08-01' AND '2012-08-10' )
FROM tab1
UNION
(SELECT DISTINCT kl FROM tab1 WHERE date BETWEEN '2012-08-11' AND '".$date."')
FROM tab1 )
.........
20 авг 12, 18:34    [13038877]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом case  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
moroz11
месяц разбивается на 3 декады.
..

насколько я понял, вы хотите в зависимости от даты формировать запрос с разным числом столбцов?
если так - используйте динамический sql (или на клиенте, аналогично запрос формируйте )
20 авг 12, 19:07    [13039075]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом case  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51815

SELECT DISTINCT trunc(extract(day from date)/10), kl FROM tab1
  WHERE date BETWEEN '2012-08-01' AND '".$date."

Posted via ActualForum NNTP Server 1.5

20 авг 12, 19:19    [13039115]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом case  [new]
moroz11
Member

Откуда:
Сообщений: 192
в зависимости от даты будут выбираться данные из таблицы,но число столбцов-одно и то же.
Не получается c case,который и дает проверять к какой декаде относится выбранная дата.
20 авг 12, 19:20    [13039122]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом case  [new]
Proteus
Member

Откуда:
Сообщений: 1348
WITH dt AS
 (SELECT LEVEL + TRUNC(SYSDATE, 'mm') - 1 date$
        ,round(dbms_random.value*10,2) amount
    FROM dual
  CONNECT BY (LEVEL + TRUNC(SYSDATE, 'mm') - 1) <= last_day(SYSDATE))
SELECT * FROM  
 (SELECT dt.date$, ceil(EXTRACT(DAY FROM date$) / 10) dcd, dt.amount
          FROM dt
         WHERE dt.date$ BETWEEN TRUNC(:param1, 'mm') AND :param1) 
 pivot (SUM(amount) FOR dcd IN(1 AS d1 ,2 AS d2,3 AS d3))

Не уверен что правильно понял вопрос... но может это поможет.

Не понял зачем CASE для определения декады. Не проще ли день поделить на 3 и привести к большему целому?
Запрос будет работать только на 11 версии.
20 авг 12, 19:36    [13039183]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом case  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
moroz11
в зависимости от даты будут выбираться данные из таблицы,но число столбцов-одно и то же.
Не получается c case,который и дает проверять к какой декаде относится выбранная дата.

with t as (select sysdate+level d from dual connect by level<100)
select d,case when extract(day from d) between 1  and 10 then 1
             when extract(day from d) between 11 and 20 then 2
             else 3 end as dec
   from t;
20 авг 12, 19:38    [13039196]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом case  [new]
moroz11
Member

Откуда:
Сообщений: 192
orawish,спасибо.
20 авг 12, 23:44    [13040177]     Ответить | Цитировать Сообщить модератору
 Re: помогите с запросом case  [new]
moroz11
Member

Откуда:
Сообщений: 192
Всем огромное спасибо.Жаль,что нельзя прибавить баллы вам.
20 авг 12, 23:45    [13040180]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить