Sql 如何将这个新的自定义列添加到查询的输出中?
我正在使用SQL Server 2014,我有以下T-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
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)