Как я могу добавить этот новый пользовательский столбец к выводу моего запроса? - PullRequest
0 голосов
/ 25 марта 2019

Я использую SQL Server 2014, и у меня есть следующий запрос T-SQL:

SELECT 
    [Date],
    (CASE
        WHEN [Date] BETWEEN '2016-07-01' AND '2017-06-30' THEN 'FY 16-17'
        WHEN [Date] BETWEEN '2017-07-01' AND '2018-06-30' THEN 'FY 17-18'
        WHEN [Date] BETWEEN '2018-07-01' AND '2019-06-30' THEN 'FY 18-19'
        ELSE 'Not Stated'
     END) AS [Period]
FROM 
    DateDimension
WHERE  
    [Date] BETWEEN '2016-07-01' AND '2019-06-30'

Вывод выглядит следующим образом (извлечение):

Date          Period
-----------------------
2016-07-01    FY 16-17
2016-07-02    FY 16-17
2016-07-03    FY 16-17
...           ...
2017-07-01    FY 17-18
2017-07-02    FY 17-18
2017-07-03    FY 17-18
...           ...
2018-07-01    FY 18-19
2018-07-02    FY 18-19
2018-07-03    FY 18-19
...           ...

Я хочу добавитьновый столбец для вывода следующий:

    Date          Period       Day
    -------------------------------
    2016-07-01    FY 16-17     D1
    2016-07-02    FY 16-17     D2
    2016-07-03    FY 16-17     D3
    ...           ...          ...
    2017-07-01    FY 17-18     D1
    2017-07-02    FY 17-18     D2
    2017-07-03    FY 17-18     D3
    ...           ...          ...
    2018-07-01    FY 18-19     D1
    2018-07-02    FY 18-19     D2
    2018-07-03    FY 18-19     D3
    ...           ...          ...

Чтобы отметить, что D1 начинается снова в начале каждого нового финансового года (то есть 2016-07-01, 2017-07-01 и 2018-07-01).

Как написать код SQL для этого нового столбца?

Дополнительное примечание: D1 должно быть непрерывным до конца каждого финансового года.Например, от 2016-07-01 до 2017-06-30, столбец Period будет показывать D1, D2, ..., D365)

Ответы [ 5 ]

0 голосов
/ 25 марта 2019

Хочу отметить, что вы можете выразить запрос как:

SELECT d.[Date], v.period,
       CONCAT('D', ROW_NUMBER() OVER (PARTITION BY period ORDER BY date)) as [Day]
FROM DateDimension dd CROSS APPLY
     (VALUES (RIGHT(DATENAME(year, d.[Date]), 2) + '-' +
              RIGHT(DATENAME(year, DATEADD(year, 1, d.[Date])), 2) 
             )
     ) as v(period)
WHERE [Date] BETWEEN '2016-07-01' AND '2019-06-30';

period также можно определить как:

     (VALUES (CONCAT(YEAR([Date] % 100, '-',
                     1 + YEAR([Date] % 100
                    )
             )
     ) as v(period)
0 голосов
/ 25 марта 2019

Вы можете использовать DATEDIFF для вычисления количества дней в этом финансовом году. Вам просто нужно приложить дополнительные усилия, чтобы получить первую дату финансового года для столбца ДАТА.

DECLARE @DateDimension TABLE ([DATE] DATETIME)
INSERT INTO @DateDimension
SELECT '2019-03-25' 
UNION ALL 
SELECT '2018-12-06'
UNION ALL 
SELECT '2018-05-15'
UNION ALL 
SELECT '2017-11-22'
UNION ALL 
SELECT '2019-07-06'

SELECT  [DATE]
,'D'+CAST( DATEDIFF(DD, CASE WHEN MONTH([DATE]) BETWEEN 7 AND 12 
        THEN DATEFROMPARTS(YEAR([DATE]),07,01) 
        ELSE DATEFROMPARTS(YEAR([DATE])-1,07,01) END,[DATE])+1 
    AS VARCHAR(3)) AS DAY_IN_FY
FROM @DateDimension

Результат:

+-------------------------+-----------+
|          DATE           | DAY_IN_FY |
+-------------------------+-----------+
| 2019-03-25 00:00:00.000 | D268      |
| 2018-12-06 00:00:00.000 | D159      |
| 2018-05-15 00:00:00.000 | D319      |
| 2017-11-22 00:00:00.000 | D145      |
| 2019-07-06 00:00:00.000 | D6        |
+-------------------------+-----------+
0 голосов
/ 25 марта 2019

Вы можете использовать DATEDIFF, чтобы получить разницу в днях между началом финансового года и [Date].

SELECT 

[Date]
,(CASE WHEN [Date] between '2016-07-01' and '2017-06-30' THEN 'FY 16-17'
  WHEN [Date] between '2017-07-01' and '2018-06-30' THEN 'FY 17-18'
  WHEN [Date] between '2018-07-01' and '2019-06-30' THEN 'FY 18-19'
  ELSE 'Not Stated'
  END) as [Period]
, CASE WHEN [Date] < DATEFROMPARTS(DATEPART(Year, GETDATE()), 7, 1)
       THEN CONCAT('D', (DATEDIFF(DAY, DATEFROMPARTS(DATEPART(Year, [Date]) - 1, 7, 1), [Date] + 1)))
       ELSE CONCAT('D', (DATEDIFF(DAY, DATEFROMPARTS(DATEPART(Year, [Date]), 7, 1), [Date] + 1)))
  END AS [Day]

FROM DateDimension

WHERE [Date] between '2016-07-01' and '2019-06-30'

Этот метод также означает, что даты могут быть в любом порядке или даже могут отсутствовать несколько дней, и столбец Day все равно должен быть правильным.

0 голосов
/ 25 марта 2019

Вот пример того, как вы можете упростить существующий расчет по финансовому году, а также получить день финансового года:

declare @date date = '20190702';

select year(dateadd(month, -6, @date)) as [FY],
  datediff(day, datefromparts(year(dateadd(month, -6, @date)), 6, 30), @date) as [DOFY];

Жестко закодированные константы, обозначающие смещение между календарным и финансовым годом, также могут быть параметризованы, если вам это необходимо.

0 голосов
/ 25 марта 2019

использование row_number()

with cte as
(
 SELECT [Date]
,(CASE WHEN [Date] between '2016-07-01' and '2017-06-30' THEN 'FY 16-17'
      WHEN [Date] between '2017-07-01' and '2018-06-30' THEN 'FY 17-18'
      WHEN [Date] between '2018-07-01' and '2019-06-30' THEN 'FY 18-19'
      ELSE 'Not Stated'
      END) as [Period]
FROM DateDimension
)

select *,concat('D',row_number() over(partition by period order by date)) as DayNo
    from cte
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...