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