Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用Group By在Access查询中运行sum_Sql_Ms Access_Sum - Fatal编程技术网

Sql 使用Group By在Access查询中运行sum

Sql 使用Group By在Access查询中运行sum,sql,ms-access,sum,Sql,Ms Access,Sum,我无法在Access查询中获得运行总和。我有一个管道系统,我试图通过管道网络总结流量Q。我一直在尝试根据ID下游的组和Q总计的DSum进行运行求和。然而,我不断得到错误或错误的输入 理想的输出是,我可以看到通过网络累积的流量,如表和图所示 您有几个选择。然而,有一种方法不行,那就是只使用SQL进行递归查询;Access不会被愚弄,它将声明一个循环引用。您唯一的机会是创建一个查询,只解析有限数量的级别,例如8或10 但是您可以在域聚合函数(如DLookup)中包含递归调用。然而,这是非常缓慢的,

我无法在Access查询中获得运行总和。我有一个管道系统,我试图通过管道网络总结流量Q。我一直在尝试根据ID下游的组和Q总计的DSum进行运行求和。然而,我不断得到错误或错误的输入

理想的输出是,我可以看到通过网络累积的流量,如表和图所示


您有几个选择。然而,有一种方法不行,那就是只使用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中的记录集来执行此操作。