Я пытаюсь написать запрос, который будет принимать четыре части пользовательского ввода: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
Почему использование месяцев не подходит, если соответствующие даты хранятся в виде лет и месяцев? –
@ Гордон, как говорит Ариз, он получает неверные данные.И это происходит именно из-за использования месяцев. Расчет месяцев с 01/2012 по 07/2013 должен давать лет 18 месяцев, но способ, которым он занимается, дает 6. То, что вы делаете, многократное, неплохо и будет работать, если у вас есть интервал больше 100 лет. Я считаю, что он должен использовать даты. –
@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