访问SQL查询:按月分组(如果不存在)

时间:2018-10-08 20:30:57

标签: sql ms-access

在我的表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;

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:0)

您可以拥有一个年月表/查询并创建表的外部联接,也可以创建笛卡尔查询来动态生成年月范围:

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的月份值。

然后将预算值相加,并按年份-月份分组。

答案 1 :(得分:-1)

您必须创建一个包含所有月份的表的变量,然后将其与表连接,并且总和必须为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