Sql 使用Group By在Access查询中运行sum
我无法在Access查询中获得运行总和。我有一个管道系统,我试图通过管道网络总结流量Q。我一直在尝试根据ID下游的组和Q总计的DSum进行运行求和。然而,我不断得到错误或错误的输入 理想的输出是,我可以看到通过网络累积的流量,如表和图所示Sql 使用Group By在Access查询中运行sum,sql,ms-access,sum,Sql,Ms Access,Sum,我无法在Access查询中获得运行总和。我有一个管道系统,我试图通过管道网络总结流量Q。我一直在尝试根据ID下游的组和Q总计的DSum进行运行求和。然而,我不断得到错误或错误的输入 理想的输出是,我可以看到通过网络累积的流量,如表和图所示 您有几个选择。然而,有一种方法不行,那就是只使用SQL进行递归查询;Access不会被愚弄,它将声明一个循环引用。您唯一的机会是创建一个查询,只解析有限数量的级别,例如8或10 但是您可以在域聚合函数(如DLookup)中包含递归调用。然而,这是非常缓慢的,
您有几个选择。然而,有一种方法不行,那就是只使用SQL进行递归查询;Access不会被愚弄,它将声明一个循环引用。您唯一的机会是创建一个查询,只解析有限数量的级别,例如8或10 但是您可以在域聚合函数(如
DLookup
)中包含递归调用。然而,这是非常缓慢的,因为调用查询的DLookup
将针对每个记录运行。对于几十条以上的记录来说,这很可能是不可接受的
我发现,对于无限数量的级别,最快的方法是创建一个查找函数,为每个记录遍历树。这可以输出记录的级别,也可以通过记录的键和上面的所有键生成复合键
由于lookup函数将为每个调用使用相同的记录集,因此您可以将其设置为静态,并且(对于JET/ACE),您可以通过使用Seek
查找记录来进一步改进
下面是一个例子,它将给你一个想法:
函数递归查找(ByVal lngID长度)为字符串
作为数据库的静态数据库
静态tbl作为TableDef
静态rst作为记录集
模糊的水平和长的一样
像细绳一样模糊的散落物
如果dbs什么都不是,那么
“仅用于测试。
'替换为后端数据库文件的OpenDatabase。
设置dbs=CurrentDb()
设置tbl=dbs.TableDefs(“tblAccount”)
Set rst=dbs.OpenRecordset(tbl.Name,dbOpenTable)
如果结束
用rst
.Index=“PrimaryKey”
当lngID>0时
.Seek“=”,lngID
如果不是,那是诺玛奇
lngLevel=lngLevel+1
lngID=!主帐户FK.值
如果lngID>0,则
strAccount=str(!AccountID)&strAccount
如果结束
其他的
lngID=0
如果结束
温德
'保持记录集打开。
"关!
以
'不要终止静态对象。
'设置rst=无
'设置tbl=无
'设置dbs=无
'用于返回级别的替代表达式。
'(调整函数返回值的vartype。)'RecursiveLookup=lngLevel'尽可能长
RecursiveLookup=strAccount
端函数
这假定表的主键ID和外键(主)指向父记录,顶层记录(未使用)的可见键(AccountID)为0
现在,使用这样的查询,您的树几乎可以立即显示出来,其中Account将是可见的复合键:
选择
*,递归查找([ID])作为帐户
从…起
tblAccount
哪里
帐户ID>0
订购人
递归查找([ID]);
你的跑步总量似乎没有意义。你能仔细检查一下你给我们看的数据吗?你在寻找一个分层(即递归)查询。这在MS Access中是不可能的。@TimBiegeleisen:请注意,D包含5。所以,5+8+7+5=25。那么25+10=35。@ThorstenKettner:在SQL中不是这样的,没错。但您可以使用VBA中的记录集来执行此操作。