2014-02-04 2 views
1

Я пытаюсь написать запрос, который будет принимать четыре части пользовательского ввода:Oracle SQL - запрос для начала и конца месяца/года комбинация

Входит Месяц

начала года

Ending месяц

Ending Год

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

Начало Месяц: январь

Начало Год: 2012

Окончание Месяц: август

Ending Год: 2013

С пути Я закодировал свой запрос, он только поднялся с января по август 2012 года, а также с января по август 2013 года. Я хочу, чтобы он забрал весь 2012 год, а затем с января по август 2013 года. Я предполагаю, что мне нужен союз заявление для этого, но я признаю что я не очень хорошо разбираюсь в Oracle SQL, так как у меня не так много возможностей часто практиковать его. Поэтому вполне возможно, что я ошибаюсь.

Я попытался обновить свой запрос, включив в него инструкцию union, а Oracle сделал ошибку в том, что я использовал недопустимый идентификатор для трех полей в моей группе по выражению (trsum.project_id, trsum.month и trsum.year) , Когда я попытался изменить их на псевдонимы, которые я присвоил столбцам (ordered_id, ordered_month и ordered_year), я получаю сообщение об ошибке, когда поле project_id не является одной групповой функцией. Мне явно не хватает чего-то для создания запроса на объединение, который включает в себя группу по выражению, но я буду проклят, если смогу выяснить, что на данный момент.

Я включил упрощенную версию моего обновленного запроса, который содержит все основные положения, которые я упомянул здесь, в тактике для справки. Первая половина перед заявлением объединения - это исходный запрос, который я написал, а вторая половина - моя попытка попытаться получить данные, которые я искал из моего приведенного выше примера. Если у кого-то есть предложения или советы по поводу того, что я делаю неправильно, или если есть лучший способ получения данных, которые я ищу, я открыт для всех предложений. Если мне что-то нужно уточнить, не стесняйтесь спрашивать.

select * from(
    select trsum.project_id as ordered_id 
      , trsum.month as ordered_month 
      , trsum.year as ordered_year 
      , sum(trsum.costs) "Costs" 
      , sum(trsum.hours) "Hours" 
    from 
     substituteTableName trsum 
    where 
     trsum.month between :START_MONTH and :END_MONTH 
     and trsum.year between :START_YEAR and :END_YEAR 

    union 

    select trsum2.project_id as ordered_id 
      , trsum2.month as ordered_month 
      , trsum2.year as ordered_year 
      , sum(trsum2.costs) "Costs" 
      , sum(trsum2.hours) "Hours" 
    from 
     substituteTableName trsum2 
    where 
     trsum2.month between :START_MONTH and 11 
     and trsum2.year = :START_YEAR 
) 
group by trsum.project_id, trsum.month, trsum.year 
order by 
     ordered_id 
    , ordered_year 
    , ordered_month 

ответ

2

Вы должны использовать даты, а не только месяц между, потому что это неверно. Что-то вроде:

WHERE 
    to_date((trsum.ppt_fiscal_month + 1 || '-' || trsum.ppt_fiscal_year), 'MM-YYYY') >= 
     to_date((start_month || '-' || start_year), 'MM-YYYY' 
AND 
to_date((trsum.month + 1 || '-' || trsum.year),'MM-YYYY') <= 
     to_date((end_month || '-' || end_year), 'MM-YYYY' 

и аналогичным образом другое состояние.

+0

Почему использование месяцев не подходит, если соответствующие даты хранятся в виде лет и месяцев? –

+0

@ Гордон, как говорит Ариз, он получает неверные данные.И это происходит именно из-за использования месяцев. Расчет месяцев с 01/2012 по 07/2013 должен давать лет 18 месяцев, но способ, которым он занимается, дает 6. То, что вы делаете, многократное, неплохо и будет работать, если у вас есть интервал больше 100 лет. Я считаю, что он должен использовать даты. –

+0

@ThrashBean, спасибо за руководство до сих пор. К сожалению, я пренебрег упоминанием о том, что поле месяца хранится как off set number между 0 и 11, где 0 - январь, а 11 - декабрь. Когда я пытаюсь сделать следующий выбор: 'code'select to_date (to_char (trsum.ppt_fiscal_month || '-' || trsum.ppt_fiscal_year), 'MM-YY')' code' Я получаю ошибку «недействительный месяц». Можно ли отрегулировать эту часть запроса? Я очень заинтересован в том, чтобы опробовать ваше предложение, поскольку оно имеет больше смысла, чем то, к чему я пришел до сих пор. – Arise

0

Я думаю, что простой способ приблизиться к этой ситуации - преобразовать значения в форму YYYYMM. Ваши where положения стали:

where trsum.year*100 + trsum.month between :START_YEAR * 100 + :START_MONTH and 
              :END_YEAR * 100 + :END_MONTH 


where trsum.year*100 + trsum.month between :START_YEAR * 100 + :START_MONTH 
              :START_YEAR * 100 + 11; 

Конечно, второй один не должен быть изменен. Он должен работать правильно, как написано.

Смежные вопросы