首页 > 解决方案 > 如何将此新的自定义列添加到查询的输出中?

问题描述

我正在使用 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-012018-07-01

如何为这个新列编写 SQL 代码?

附加说明:D1应持续到每个财政年度结束。例如,从2016-07-01until 2017-06-30,列Period将显示 D1, D2, ..., D365)

标签: sqlsql-servertsql

解决方案


这是一个示例,您可以如何简化现有的 FY 计算,并获得财政年度的日期:

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];

如果需要,也可以对指定日历和财政年度之间偏移量的硬编码常量进行参数化。


推荐阅读