[英]Access SQL Query: group by month, also if not present
在表Table2
我按日期組織了一些金額。 並非所有月份都存在。
我需要一個查詢,該查詢為一年的每個月給我一行,所以有12行:一月,二月,依此類推。
每個月; 我需要當月所有金額的總和以及按月得出的結果。
我嘗試使用下面的代碼給我Table2 Query
但這不是我所需要的。 例如,這里我們只有6個月而不是12個月,而且它們不是按時間順序排列的。
SELECT DISTINCTROW Format$([Table2].[Data],'mmmm yyyy') AS [Data By Month], Sum(Table2.Budget) AS [Sum Of Budget]
FROM Table2
GROUP BY Format$([Table2].[Data],'mmmm yyyy'), Year([Table2].[Data])*12+DatePart('m',[Table2].[Data])-1;
您可以有一個年月表/查詢並創建表的外部聯接,也可以創建笛卡爾查詢來動態生成年月范圍:
SELECT
Format(DateSerial(Year([Data]),[Month],1),"mmmm yyyy") AS YearMonth,
Sum(Nz(IIf(DateSerial(Year([Data]),[Month],1)=DateSerial(Year([Data]),Month([Date]),1),Table2.[Budget],0),0)) AS Total
FROM
(SELECT DISTINCT
[Tens]+[Ones] AS [Month],
10*Abs([Deca].[id] Mod 10) AS Tens,
Abs([Uno].[id] Mod 10) AS Ones
FROM
MSysObjects AS Uno,
MSysObjects AS Deca) AS Months,
Table2
WHERE
Months.[Month] Between 1 And 12
GROUP BY
DateSerial(Year([Data]),[Month],1)
ORDER BY
DateSerial(Year([Data]),[Month],1);
子查詢( Months )生成0到100之間的數字。這些數字被過濾為1到12的月份值。
然后將預算值相加,按年-月分組。
您必須創建一個包含所有月份的表的變量,然后將其與表連接,並且總和必須為ISNULL(SUM(...),0)
您可以通過這種方式創建該表...
DECLARE @FromDate DATETIME, @ToDate DATETIME;
SET @FromDate = '2018-01-01';
SET @ToDate = '2018-12-31';
DECLARE @Dates table (
TheDate date,
month integer,
year integer);
INSERT into @Dates
SELECT TOP (DATEDIFF(MONTH, @FromDate, @ToDate)+1)
TheDate = DATEADD(MONTH, number, @FromDate),
TheMonth = MONTH(DATEADD(MONTH, number, @FromDate)),
TheYear = YEAR(DATEADD(MONTH, number, @FromDate))
FROM [master].dbo.spt_values
WHERE [type] = N'P' ORDER BY number;
Select * FROM @Dates
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.