我试图将几周分成几个季度。宿舍定义:
1 Jan - 31MAR
1 APR - 30JUN
1 JUL - 30SEP
1 OCT - 31DEC
我尝试使用weekOfYear进行分组,但是我不知道如何从weekOfYear int值获取星期的开始和结束。
下面是示例日期的列表。如果一个星期重叠一个季度,我想缩短它。例如,该季度的最后一周可能是6月28日至30日。
这是我尝试实现的格式。几周必须从季度开始:
1-7 Jan
8-14 Jan
15-21 Jan
22-28 Jan
29-4 FEB
5-11 FEB
12-18 FEB
19-25 FEB
26-3 MAR
4-10 MAR
11-17 MAR
18-24 MAR
25-31 MAR
我正在尝试将日期列表与帐单金额进行分组,如下所示:
Invoice Issued Date cost
2020-01-01 00:00:00.000 18259.00
2020-01-08 00:00:00.000 35374.00
2020-01-15 00:00:00.000 19793.00
2020-01-22 00:00:00.000 91014.00
2020-02-02 00:00:00.000 23252.00
2020-02-09 00:00:00.000 34628.00
2020-02-16 00:00:00.000 48214.00
2020-02-23 00:00:00.000 9146.00
2020-03-03 00:00:00.000 20234.00
如果这在SQL Server中更容易实现,那么我也对此持开放态度。
答案 0 :(得分:0)
您可以按照以下说明完全在SQL中完成此操作。
我可以自由地通过将月份数除以4来定义四分之一。
(DATEPART(MONTH, [Date]) / 4) + 1
很明显,如果这不适合您,则可以用所需的逻辑替换它。
-- Table Structure
CREATE TABLE Invoice (
Id INT IDENTITY(1,1) PRIMARY KEY,
Date DATE NOT NULL,
Amount DECIMAL(6,2) NOT NULL
);
GO
-- Sample Data (1000 rows)
;WITH CTE_1000 AS (
SELECT TOP 1000 ROW_NUMBER() OVER (ORDER BY object_id) r
FROM sys.all_objects
)
INSERT INTO Invoice (Date, Amount)
SELECT
DATEADD(DAY, r - 1, '20200101'),
ROUND(RAND(CHECKSUM(NEWID())) * 1000, 2)
FROM CTE_1000;
GO
-- Aggregate Query
;WITH CTE_Quarters AS (
SELECT
DATEPART(YEAR, [Date]) [Year],
(DATEPART(MONTH, [Date]) / 4) + 1 [Quarter],
[Amount]
FROM [Invoice]
)
SELECT
[Year],
[Quarter],
SUM([Amount]) [SumAmount]
FROM CTE_Quarters
GROUP BY [Year], [Quarter]
ORDER BY [Year], [Quarter];
SQL小提琴在这里:http://sqlfiddle.com/#!18/73778/3