如何将MS Access中三个财务数据透视查询合并为一个?
合并三个Access查询为一个解决方案
当然可以把这三个查询合并成一个!咱们直接实现你想要的输出格式——把年度总计、有收据、无收据的统计结果整合到同一张表里,按年份分组展示所有维度的数据。
首先先确认下原表结构:
tblFinances ------------------------------- -FinancesID => AutoNumber -FinancesDate => Date -Price => Currency -ReceiptYesNo => Yes/No
合并后的SQL查询
我们可以用UNION ALL结合透视查询的思路,在一个查询里同时生成三种统计类型的行,不需要拆分三个独立查询。直接看代码:
TRANSFORM IIf(Sum(Amount) Is Null, 0, Sum(Amount)) AS MonthlyPrice SELECT Format([FinancesDate],"yyyy") AS [Year], Receipt, IIf(Sum(Amount) Is Null, 0, Sum(Amount)) AS TotalPrice FROM ( -- 第一部分:生成"Total"类型的统计行 SELECT FinancesDate, 'Total' AS Receipt, Price AS Amount FROM tblFinances UNION ALL -- 第二部分:生成"Yes"(有收据)类型的统计行 SELECT FinancesDate, 'Yes' AS Receipt, IIf(ReceiptYesNo='Yes', Price, 0) AS Amount FROM tblFinances UNION ALL -- 第三部分:生成"No"(无收据)类型的统计行 SELECT FinancesDate, 'No' AS Receipt, IIf(ReceiptYesNo='No', Price, 0) AS Amount FROM tblFinances ) AS CombinedData GROUP BY Format([FinancesDate],"yyyy"), Receipt -- 控制排序:年份倒序,且Total行在前,Yes次之,No最后 ORDER BY Format([FinancesDate],"yyyy") DESC, Switch(Receipt='Total',1, Receipt='Yes',2, Receipt='No',3) -- 透视生成1-12月的列 PIVOT Month([FinancesDate]) In (1,2,3,4,5,6,7,8,9,10,11,12);
思路说明
- 拆分数据行:用
UNION ALL把原表数据拆成三组行,分别标记为Total、Yes、No,同时只保留对应类型的金额(比如Yes类型只统计有收据的Price,无收据的记为0); - 聚合与透视:外层用
TRANSFORM和PIVOT把月度数据转成列,同时用IIf把Null值替换为0,避免空值显示; - 排序控制:通过
ORDER BY让年份按倒序排列,同时确保Total行在每个年份的最上方,符合你想要的展示逻辑。
预期输出格式
运行这个查询后,你会得到和你需求完全匹配的结果:
Year Receipt TotalPrice 1 2 3 4 5 6 7 8 9 10 11 12 -------------------------------------------------------------------------- 2018 Total 1200 100 0 500 300 0 100 0 0 0 100 100 0 2018 Yes 800 0 0 400 100 0 100 0 0 0 100 100 0 2018 No 400 100 0 100 200 0 0 0 0 0 0 0 0 ...
内容的提问来源于stack exchange,提问作者YvetteLee
相关产品推荐
相关产品推荐

