首先,我将明确指出我不是程序员,而是内心的会计师!

我需要将与在给定一周内有交易的工作相关的所有交易返回到excel中(即,以便我可以看到一周中的金额和迄今为止的总额)。

我相当精通excel中的VBA(无论如何,还是会计!),但我始终只是复制并合并了相同的旧SQL语句。本质上,我认为我需要做的是在下面的子查询中代替WHERE语句的订单号:

    With Sheet1.QueryTables.Add(Connection:=Array(Array( _
            "ODBC;DRIVER={iSeries Access ODBC Driver};SYSTEM=JADE;DBQ=QGPL LIVDTALIB;DFTPKGLIB=QGPL;LANGUAGEID=ENU;PKG=QGPL/DEFAULT(IBM),2,0,1,0,"), _
            Array("512;QRYSTGLMT=-1;")), Destination:=Sheet1.Range("A1"))
            .CommandText = Array( _
            "SELECT SLBGDTPF.BGMCU, SLBGDTPF.BGDSDT, SLBGDTPF.ORTYPE, SLBGDTPF.ORDNO, SLBGDTPF.BGDSVL, SLBGDTPF.BGCD, ", _
            "SLBGDTPF.ADBBG, SLBGDTPF.BGRMK" _
            & Chr(13) & "" & Chr(10) & _
            "FROM RCHASE5C.LIVDTALIB.SLBGDTPF SLBGDTPF" _
            & Chr(13) & "" & Chr(10) & _
            "WHERE (SLBGDTPF.ORDNO='30214884')")
        .Name = "TEST Query"
        .FieldNames = True
        .RefreshStyle = xlOverwriteCells
        .Refresh BackgroundQuery:=False
    End With


作为独立查询,子查询元素的外观如下:

    With Sheet2.QueryTables.Add(Connection:=Array(Array( _
            "ODBC;DRIVER={iSeries Access ODBC Driver};SYSTEM=JADE;DBQ=QGPL LIVDTALIB;DFTPKGLIB=QGPL;LANGUAGEID=ENU;PKG=QGPL/DEFAULT(IBM),2,0,1,0,"), _
            Array("512;QRYSTGLMT=-1;")), Destination:=Sheet2.Range("A1"))
            .CommandText = Array( _
            "SELECT SLBGDTPF.ORDNO" _
            & Chr(13) & "" & Chr(10) & _
            "FROM RCHASE5C.LIVDTALIB.SLBGDTPF SLBGDTPF" _
            & Chr(13) & "" & Chr(10) & _
            "WHERE SLBGDTPF.BGPSDT='20180420'" _
            & Chr(13) & "" & Chr(10) & _
            "GROUP BY SLBGDTPF.ORDNO")
        .Name = "TEST Query"
        .FieldNames = True
        .RefreshStyle = xlOverwriteCells
        .Refresh BackgroundQuery:=False
    End With


我愿意接受所有建议,包括其他方法(我确实尝试过使用IN并引用工作表中的范围,但我最多需要传递1,000个不同的职位编号)

就像FYI一样,这是一个模板,将被发送给业务部门中的人员以进行自我更新,因此需要建立连接,而不仅仅是让他们刷新工作簿中的现有查询。

祝一切顺利,

最佳答案

这可以通过几种方法实现,但是假设数据库可以处理子查询,我可以尝试使用WHERE IN术语。为了清楚起见,我还进行了一些其他的粗略编辑。最终GROUP BY项在子查询中是多余的,因为只有一个子查询SELECT字段,并且没有进行聚合。

With Sheet1.QueryTables.Add(Connection:=Array(Array( _
        "ODBC;DRIVER={iSeries Access ODBC Driver};SYSTEM=JADE;DBQ=QGPL LIVDTALIB;DFTPKGLIB=QGPL;LANGUAGEID=ENU;PKG=QGPL/DEFAULT(IBM),2,0,1,0,"), _
        Array("512;QRYSTGLMT=-1;")), Destination:=Sheet1.Range("A1"))
        .CommandText = Array( _
        "SELECT SLBGDTPF.BGMCU, SLBGDTPF.BGDSDT, SLBGDTPF.ORTYPE, SLBGDTPF.ORDNO, SLBGDTPF.BGDSVL, SLBGDTPF.BGCD, SLBGDTPF.ADBBG, SLBGDTPF.BGRMK" & vbCrLf & _
        "FROM RCHASE5C.LIVDTALIB.SLBGDTPF SLBGDTPF" & vbCrLf & _
        "WHERE SLBGDTPF.ORDNO IN (" & vbCrLf & _
            "SELECT SLBGDTPF.ORDNO" & vbCrLf & _
            "FROM RCHASE5C.LIVDTALIB.SLBGDTPF SLBGDTPF" & vbCrLf & _
            "WHERE SLBGDTPF.BGPSDT='20180420')")
    .Name = "TEST Query"
    .FieldNames = True
    .RefreshStyle = xlOverwriteCells
    .Refresh BackgroundQuery:=False
End With

关于sql - SQL NOOB-嵌套/子查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50136014/

10-11 03:25
查看更多