MS Access/Access SQL:根据标准计算距离的开关函数
我对MS Access/SQL和StackOverflow有些陌生,所以请耐心听我说。我有一个我似乎无法解决的问题。我以前曾发布过这篇文章,但没有得到回应,编辑我的原始文章也没有帮助 我有每周资产的数量和距离数据。并非所有的周都有数量或距离(有些周只有一个或另一个)。以下是一项资产的数据示例(输入CSV): 资产、周、数量、距离、实际距离 2153,1,125 2153,2,65, 2153,3,50.1118 2153,4,123 2153,5,96.6,91 2153,6,103 2153,7,120 2153,8,106 2153,9100.6, 2153,13,96, 2153,14,102 2153,15,40 2153,18,84.82, 2153,21,97.8, 2153,25,96.7, 2153,28,31.27,63 2153,29,77.5, 我想做的是,获取“DIST”字段的总和,直到行具有相应的“QTY”字段值,这将在“Actual_DIST”字段中计算 看看我的例子,第1周和第2周没有数量值,但是在第3周,数量为50.1,我希望将“实际距离”计算为第1-3周(含第1-3周)的“距离”之和。所以从本质上讲,第3行的“实际距离”是总和(125+65+118) 现在我看到3个案例: 案例1:如上所述,如果没有数量,但有距离,则将距离相加,直到下一个数量值 案例2:如果存在数量,但没有距离,则忽略 案例3:如果Qty有一个值,而Dist有一个值,并且Qty在之前(即第28周)有一个值,那么“实际距离”=Dist 所以我想做一个选择开关来涵盖两个主要情况(1和3): 选择资产、周、数量、距离、开关(数量如“空”和距离为“空”,总和(距离)为实际距离,开关(数量为“空”和距离为“空”,距离)为实际距离 **不确定我的开关是否正确,但我想你明白了吗 现在,我的问题出现在上面的求和函数中。如何正确求和并在出现数量值之前获取距离值(案例2)?如果样本数据的格式或表示不好,我深表歉意。刚刚注册。我可能必须澄清一些要点,所以请让我知道,必要时我会澄清 同样重要的是要注意,这只是一个资产,而且有很多资产。对于上面的sum函数,我需要它能够为任何给定数量的记录求和上面的记录 希望有人能帮忙 谢谢 编辑:@Cha发布了以下内容:MS Access/Access SQL:根据标准计算距离的开关函数,sql,ms-access,Sql,Ms Access,我对MS Access/SQL和StackOverflow有些陌生,所以请耐心听我说。我有一个我似乎无法解决的问题。我以前曾发布过这篇文章,但没有得到回应,编辑我的原始文章也没有帮助 我有每周资产的数量和距离数据。并非所有的周都有数量或距离(有些周只有一个或另一个)。以下是一项资产的数据示例(输入CSV): 资产、周、数量、距离、实际距离 2153,1,125 2153,2,65, 2153,3,50.1118 2153,4,123 2153,5,96.6,91 2153,6,103 2153,
选择Data.Asset、Data.Week、Data.Qty、Data.Dist、Switch(不为空([Qty])、不为空([Dist])、[Dist]、不为空([Qty])、Nz(DSum(“Dist”、“Data”、“Asset=”&CStr([Asset])、“And Week”&CStr(Nz(DMin(“Week”、“Data”、“Asset=”&CStr([Asset])、“Week])、”和“Week<&CStr([Week])、“And Not IsNull(Qty)”),0)))与数据的实际距离;
由于数据不匹配,此代码给了我错误,因此我将所有数据类型更改为“Number”,并按如下方式修改代码:
选择Data.Asset、Data.Week、Data.Qty、Data.Dist、Switch(不为空([Qty])、Nz(DSum(“Dist”)、“[Data]”、“Asset=“&[Asset]&”和“Week”、“Asset=“&[Asset]&”和“Week<[Week]&“不为空([Qty])、0))作为实际Dist
来自数据;
上面的代码现在满足情况1,但只满足第3行和第5行。这种情况不满足第9行和第13行,它也需要在那里应用。我相信这些行的问题是“Dist”为空
还有一个问题,案例1和案例3偶尔会相互覆盖(当数量和距离都不为空时)。是否有方法创建一个开关来运行案例1,以及另一个(代码相同)开关来应用案例3而不是案例1
任何帮助都将不胜感激
谢谢如果您可以使用VBA,请尝试以下方法:
Public Sub GetActual_Dist()
Const TABLE_NAME As String = "tblAssets"
Dim sTemp_Dist As Single
With CurrentDb.OpenRecordset("SELECT * FROM [tblAssets] WHERE NOT ([Qty] is not Null AND [Dist] is Null);")
If .EOF And .BOF Then
MsgBox "No data"
Exit Sub
End If
Do Until .EOF
If ![Qty] Is Null Then
sTemp_Dist = sTemp_Dist + ![Dist]
Else
.Edit
![Actual_Dist] = sTemp_Dist
.Update
sTemp_Dist = 0
End If
.MoveNext
Loop
End With
End Sub
将表名更改为数据库中的表名。您好。它必须与SQL一起工作,还是我可以为您编写一些VBA?