SQL для разделения YYYY MM на финансовый год

У меня есть столбец, в котором указаны месяц и год YYYY MM. Я разделил их на два столбца (Year и Month). Проблема в том, что год - это календарный год, тогда как в идеале мне нужен финансовый год, который я использую (от Apr 01 до Mar 31 - это никогда не изменится).

Другие решения, которые я видел, основаны на формате даты, тогда как мой исходный столбец - это строка.

Мне нужен оператор, который возвращает финансовый год для моей колонки нового года вместо календарного года.

Мое текущее утверждение:

Select Month,
parsename(replace(Month,' ','.'),1) as MonthM,
parsename(replace(Month,' ','.'),2) as Year
FROM TblTrade

Который работает для разделения столбцов.

Таким образом, ожидаемые результаты будут такими, например: 15 февраля становится февралем и 2015 годом. 15 апреля становится апрелем и 2016 годом.

Пожалуйста, порекомендуйте.


person Bikkembergs    schedule 27.01.2016    source источник
comment
Можете ли вы добавить некоторые образцы данных и ожидаемый результат?   -  person jarlh    schedule 27.01.2016
comment
Пожалуйста, добавьте вашу систему. (SQL-сервер, доступ...)   -  person Nik Bo    schedule 27.01.2016
comment
Дублировать... stackoverflow.com/questions/ 1771995/ и stackoverflow.com/questions/20554611/ и stackoverflow.com/questions/12815334/ и... и... и...   -  person Liesel    schedule 27.01.2016
comment
@LesH Я просмотрел множество других тем, но, к сожалению, не смог найти пример, в котором исходный формат соответствует моему. Поэтому я не могу перевести предоставленные решения.   -  person Bikkembergs    schedule 27.01.2016
comment
Это простой вопрос программирования. Если месяц январь, февраль или март, вычтите единицу из года. Какую часть этого вы не знаете, как сделать?   -  person Tab Alleman    schedule 27.01.2016


Ответы (4)


SQL-сервер:

declare @date datetime = getdate();
select 
(YEAR(DATEADD(Month,-((DATEPART(Month,@date)+5) %12),@date))) AS Financial_Year

Предполагая, что апрель месяц 1

person Matt    schedule 27.01.2016

Попробуй это

    select case 
             when to_char(to_date(column_name,'yyyy mm'),'mm') between 01 and 03 
                  then to_char(trunc(to_date(column_name,'yyyy mm')),'yyyy')-1
             else to_number(to_char(trunc(to_date(column_name,'yyyy mm')),'yyyy')) end 
    fiscal_year
    from table_name

Я использую oracle db. Это будет работать, когда столбец является строкой и имеет действительные данные, т.е. дату в формате, например yyyy mm

person Narasimha Maiya    schedule 27.01.2016

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

Если я правильно понимаю, у вас есть varchar с YYYY MM, например

2015 01
2015 02
2015 03
2015 04

и т.д. И вы хотите

Jan 2014
Feb 2014
Mar 2014
Apr 2015

Вот оно...

Настройте некоторые тестовые данные

    DROP TABLE IF EXISTS #Test;

    WITH Dates AS (
        SELECT CAST(GETDATE() AS DATE) AS Date
        UNION ALL
        SELECT DATEADD(MONTH, -1, Date) FROM Dates
        WHERE Date > '20140101'
    )
    SELECT DISTINCT
        CONVERT(VARCHAR(4), YEAR(Date)) + ' ' +RIGHT(CONVERT(VARCHAR(6), Date, 112), 2) YearMonth
    INTO #Test 
     FROM Dates
    OPTION (MAXRECURSION 0);

    SELECT * FROM #Test

YearMonth
---------
2013 12
2014 01
2014 02
2014 03
2014 04
2014 05
etc

Найти финансовый год

    SELECT 
        LEFT(YEARMONTH, 4) Year
        ,RIGHT(YEARMONTH, 2) Month
        ,LEFT(DATENAME(MONTH , DateAdd( month , CONVERT(INT,RIGHT(YEARMONTH, 2)) , -1 )), 3) MonthName
        ,IIF(CONVERT(INT, RIGHT(YEARMONTH, 2)) >= 4, CONVERT(INT,LEFT(YEARMONTH, 4)), CONVERT(INT,LEFT(YEARMONTH, 4)-1 )) FiscalYear
    FROM #TEST

    Year Month MonthName FiscalYear
    ---- ----- --------- -----------
    2013 12    Dec       2013
    2014 01    Jan       2013
    2014 02    Feb       2013
    2014 03    Mar       2013
    2014 04    Apr       2014
    2014 05    May       2014
    2014 06    Jun       2014
    etc

Вы можете поместить анализ года/месяца в подзапрос, чтобы сделать код чище, а некоторые неприятные форматы можно заменить на FORMAT, поскольку вы находитесь в 2012 году.

Надеюсь, это то, что вам нужно, и это поможет.

person Liesel    schedule 27.01.2016

Поскольку вы включили тег Tableau, я опишу подход Tableau, который немного отличается от других ответов, поскольку вы обычно указываете, что хотите для Tableau, и позволяете его драйверу генерировать необходимый SQL для вашей базы данных.

Во-первых, будет лучше, если у вас будет одно поле с типом данных DATE, а не отдельные поля для месяца и года.

Затем вы можете свернуть даты до ближайшего года, месяца, дня и т. д. (фактически усекая до начала периода) или извлечь определенные части дат года, месяца, дня и т. д. по мере необходимости для группировки/отображения.

Дополнительным преимуществом работы с истинным типом данных DATE является то, что вы можете указать Tableau начало финансового года для каждого источника данных, и он соответствующим образом отсортирует даты. Просто щелкните правой кнопкой мыши источник данных и установите свойства даты. Вы также можете установить начало недели и формат даты.

person Alex Blakemore    schedule 28.01.2016