簡體   English   中英

訪問SQL查詢:按月分組(如果不存在)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM