Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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
MS Access/Access SQL:根据标准计算距离的开关函数_Sql_Ms Access - Fatal编程技术网

MS Access/Access SQL:根据标准计算距离的开关函数

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,

我对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发布了以下内容:

选择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?