SQL NOOB - 嵌套/子查询

标签 sql excel vba subquery odbc

首先我要明确声明,我不是程序员,我本质上是一名会计师!

我需要将与在给定一周内进行过交易的工作相关的所有交易返回到 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 个不同的作业编号)

仅供引用,这是一个模板,将发送给企业内部的人员进行 self 更新,因此需要建立连接,而不仅仅是让他们刷新工作簿中的现有查询。

祝一切顺利,

最佳答案

这可以通过几种方法来实现,但假设数据库可以处理子查询,我会尝试使用 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 NOOB - 嵌套/子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50136014/

相关文章:

sql - 计算利用率 - 计算可用分钟数的工作分钟数

vba - 在 ThisWorkbook 中编辑脚本时 Excel 崩溃

sql - 两个日期之间的平均差异(按第三个字段分组)?

sql - 在成员(member)每月购买超过 6 个单位的情况下需要帮助拉行

excel - 用户窗体关闭时如何自动保存工作簿?来自红色 "X"

excel - 如何在excel VBA中读取目录中的某些文件

excel - 替换 Excel 文件页眉和页脚上的文本

vba - Excel VBA 格式化十六进制

php - SQL 在同一个表中创建行的副本

sql - 从逗号分隔的 id 获取逗号分隔的文本