Access SQL查询:按月分组,如果不存在也可以
在我的表Access SQL查询:按月分组,如果不存在也可以,sql,ms-access,Sql,Ms Access,在我的表表2中,我有一些按日期组织的金额。并不是所有的月份都存在 我需要一个查询,它为一年中的每个月提供一行,即12行:一月、二月等等 每月;我需要当月所有金额的总和以及按月计算的结果 我尝试了以下代码,它提供了Table2查询,但这不是我需要的。例如,这里我们只有6个月,而不是12个月,并且它们不是按时间顺序组织的 SELECT DISTINCTROW Format$([Table2].[Data],'mmmm yyyy') AS [Data By Month], Sum(Table2.Bud
表2
中,我有一些按日期组织的金额。并不是所有的月份都存在
我需要一个查询,它为一年中的每个月提供一行,即12行:一月、二月等等
每月;我需要当月所有金额的总和以及按月计算的结果
我尝试了以下代码,它提供了Table2查询
,但这不是我需要的。例如,这里我们只有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;
您必须创建一个包含所有月份的表的变量,然后将其与您的表联接,并且您的总和必须为ISNULL(总和(…),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
您可以使用年-月表/查询并创建表的外部联接,也可以动态创建生成年-月范围的笛卡尔查询:
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);
子查询(月)生成0到100之间的数字。将这些值过滤为1到12的月份值
然后对预算值进行汇总,按年度和月份进行分组。@a_horse_,我正在使用Access。对不起,我不知道它是哪个SQL。在MS Access中,您需要为此设置一个日历表。