Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何将这个新的自定义列添加到查询的输出中?_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何将这个新的自定义列添加到查询的输出中?

Sql 如何将这个新的自定义列添加到查询的输出中?,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在使用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-0

我正在使用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       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
,列
期间将显示D1、D2、…、D365)

使用
行编号()


您可以使用
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'
选择
[日期]
,(如果[日期]介于'2016-07-01'和'2017-06-30'之间,则为'2016-17财年'
当[日期]介于'2017-07-01'和'2018-06-30'之间时,则为'2017-18财年'
当[日期]介于“2018-07-01”和“2019-06-30”之间时,则为“FY 18-19”
否则“未声明”
结束)作为[期间]
,当[Date]

此方法还意味着日期可能按任何顺序排列,甚至可能缺少几天,
Day
列应该仍然正确。

下面是一个示例,说明如何简化现有的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];

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

您可以使用
DATEDIFF
计算该财政年度的天数。您只需付出额外的努力就可以为date列获取财政年度的第一个日期

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        |
+-------------------------+-----------+

我想指出,您可以将查询表示为:

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';
期间
也可以定义为:

     (VALUES (CONCAT(YEAR([Date] % 100, '-',
                     1 + YEAR([Date] % 100
                    )
             )
     ) as v(period)

您正在从名为
DateDimension
的表中进行选择。我希望此表已经包含与日期相关的列,例如当前日期属于哪个财政年度以及该财政年度中的哪一天……您似乎错过了必须从7月1日开始计数的点。此外,表中缺少的一天会将
行编号()
变成南瓜。
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';
     (VALUES (CONCAT(YEAR([Date] % 100, '-',
                     1 + YEAR([Date] % 100
                    )
             )
     ) as v(period)