sql - MS Access SQL, "function calls"

标签 sql vba function ms-access

我正在涉足 SQL,现在使用 Access,因为我厌倦了尝试在 Excel 中编写条件查询,并且我有一个 SQL 查询,除了列名之外都有重复,非常像函数,我想通过执行 CountSubCategories(Category) 之类的操作来清理多余的内容,以减少冗余代码,如下所示...

SELECT
COUNT(*) AS “Support_Interactions”,
SUM(IIF([Type of Inquiry] = "Confidence Check",1, 0)) AS ConfidenceCheck,
   SUM(IIF(([Type of Inquiry] = "Confidence Check") AND 
   ([Billing]<>NULL),1, 0)) AS CC_Sub_Billing,
   SUM(IIF(([Type of Inquiry] = "Confidence Check") AND 
   ([General & CBS]<>NULL),1, 0)) AS CC_Sub_General&CBS,
   SUM(IIF(([Type of Inquiry] = "Confidence Check") AND 
   ([Phone]<>NULL),1, 0)) AS CC_Sub_Phone,
   SUM(IIF(([Type of Inquiry] = "Confidence Check") AND 
   ([Process]<>NULL),1, 0)) AS CC_Sub_Process,
   SUM(IIF(([Type of Inquiry] = "Confidence Check") AND 
   ([Tools]<>NULL),1, 0)) AS CC_Sub_Tools,
   SUM(IIF(([Type of Inquiry] = "Confidence Check") AND 
   ([Technical Support]<>NULL),1, 0)) AS CC_Sub_TechnicalSupport,
   SUM(IIF(([Type of Inquiry] = "Confidence Check") AND 
   ([WO/SC]<>NULL),1, 0)) AS CC_Sub_WO&SC,
SUM(IIF([Type of Inquiry] = "Product Knowledge",1, 0)) AS ProductKnowledge,
   SUM(IIF(([Type of Inquiry] = " Product Knowledge ") AND 
   ([Billing]<>NULL),1, 0)) AS CC_Sub_Billing,
   SUM(IIF(([Type of Inquiry] = " Product Knowledge ") AND 
   ([General & CBS]<>NULL),1, 0)) AS CC_Sub_General&CBS,
   SUM(IIF(([Type of Inquiry] = " Product Knowledge ") AND 
   ([Phone]<>NULL),1, 0)) AS CC_Sub_Phone,
   SUM(IIF(([Type of Inquiry] = " Product Knowledge ") AND 
   ([Process]<>NULL),1, 0)) AS CC_Sub_Process,
   SUM(IIF(([Type of Inquiry] = " Product Knowledge ") AND 
   ([Tools]<>NULL),1, 0)) AS CC_Sub_Tools,
   SUM(IIF(([Type of Inquiry] = " Product Knowledge ") AND 
   ([Technical Support]<>NULL),1, 0)) AS CC_Sub_TechnicalSupport,
   SUM(IIF(([Type of Inquiry] = " Product Knowledge ") AND 
   ([WO/SC]<>NULL),1, 0)) AS CC_Sub_WO&SC,

正如您所看到的,父类别存在相同的子类别,那么我如何能够预先定义一个函数并使用类别作为变量来调用它?

非常感谢!

最佳答案

MS access SQL 不允许这样做,但 VBA 可以。

您基本上应该在类别和子类别上使用 2 个嵌套循环来构建 SQL 字符串

我使用集合来处理猫和子猫:

Sub StackOverflow_Solution()

    Dim colCat As New Collection
    Dim colSub  As New Collection
    Dim varCat As Variant
    Dim varSub As Variant
    Dim strSQL As String
    Dim RST As Recordset

    ' fill in categories
    colCat.Add "Confidence Check"
    colCat.Add "Product Knowledge"

    ' fill in sub categories
    colSub.Add "Billing"
    colSub.Add "General "
    colSub.Add "Phone"
    colSub.Add "Process"
    colSub.Add "Tools"


    ' initiate SQL query
    strSQL = "SELECT " & vbCrLf & _
             "COUNT(*) AS 'Support_Interactions', " & vbCrLf

    ' Looping on all categories
    For Each varCat In colCat

        ' Adding category count
        strSQL = strSQL & "SUM(IIF([Type of Inquiry] = '" & varCat & "',1, 0)) AS " & Replace(varCat, " ", "") & ", " & vbCrLf

        ' Looping on all sub categories
        For Each varSub In colSub

            strSQL = strSQL & "    SUM(IIF(([Type of Inquiry] = '" & varCat & "') AND " & vbCrLf & _
                              "    ([" & varSub & "]<>NULL),1, 0)) AS CC_Sub_" & Replace(varSub, " ", "") & ", " & vbCrLf
        Next

    Next

    Debug.Print strSQL


    ' Trigger query
    Set RST = CurrentDb.OpenRecordset(strSQL)

    If Not RST.BOF Then

        'reading resulting recordset

        While Not RST.EOF

            'dostuff with your data

            RST.MoveNext

        Wend

    End If

End Sub

有了这个子程序,您的 strSQL 将包含以下内容:

SELECT 
COUNT(*) AS 'Support_Interactions', 
SUM(IIF([Type of Inquiry] = 'Confidence Check',1, 0)) AS ConfidenceCheck, 
    SUM(IIF(([Type of Inquiry] = 'Confidence Check') AND 
    ([Billing]<>NULL),1, 0)) AS CC_Sub_Billing, 
    SUM(IIF(([Type of Inquiry] = 'Confidence Check') AND 
    ([General ]<>NULL),1, 0)) AS CC_Sub_General, 
    SUM(IIF(([Type of Inquiry] = 'Confidence Check') AND 
    ([Phone]<>NULL),1, 0)) AS CC_Sub_Phone, 
    SUM(IIF(([Type of Inquiry] = 'Confidence Check') AND 
    ([Process]<>NULL),1, 0)) AS CC_Sub_Process, 
    SUM(IIF(([Type of Inquiry] = 'Confidence Check') AND 
    ([Tools]<>NULL),1, 0)) AS CC_Sub_Tools, 
SUM(IIF([Type of Inquiry] = 'Product Knowledge',1, 0)) AS ProductKnowledge, 
    SUM(IIF(([Type of Inquiry] = 'Product Knowledge') AND 
    ([Billing]<>NULL),1, 0)) AS CC_Sub_Billing, 
    SUM(IIF(([Type of Inquiry] = 'Product Knowledge') AND 
    ([General ]<>NULL),1, 0)) AS CC_Sub_General, 
    SUM(IIF(([Type of Inquiry] = 'Product Knowledge') AND 
    ([Phone]<>NULL),1, 0)) AS CC_Sub_Phone, 
    SUM(IIF(([Type of Inquiry] = 'Product Knowledge') AND 
    ([Process]<>NULL),1, 0)) AS CC_Sub_Process, 
    SUM(IIF(([Type of Inquiry] = 'Product Knowledge') AND 
    ([Tools]<>NULL),1, 0)) AS CC_Sub_Tools, 

您应该对列 WO/SC 进行一些调整,在列的别名中,您应该将“/”替换为“&”,而不是空无一物的空格。

我完成了 90% 的工作,剩下的你可以做

关于sql - MS Access SQL, "function calls",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39094337/

相关文章:

mysql - 如何在 mysql 数据库中编辑无效的 UTF-8 字符串

sql - 查询与自身连接的表

python - 如何向已注册的 COM 服务器添加新方法?

php - php函数默认返回什么?

mysql - 如何将其归一化为 1NF/2NF?

mysql - 使用MYSQL计算同一列中多个日期之间的时间

javascript - 将日期导出为 Javascript 格式

vba - 严格使用 Excel 打开 .xlsm

来自不兼容指针类型的 C 指针数组赋值

jquery - 我这样做正确吗? .each() & .click() jquery