2016-08-23 100 views
2

我在SQL中轻拍,现在使用Access,因为我厌倦了尝试在Excel中编码条件查询,并且我有一个SQL查询,除了列名,那么像的功能,我想通过做类似CountSubCategories(类别),以减少我的冗余代码清理绒毛,当你看到下面......微软访问SQL,“函数调用”

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, 

正如你所看到的,父类别存在相同的SubCategories,那么我怎么能够预先定义一个函数并将它作为变量与Category一起调用呢?

非常感谢!

+0

这似乎是可能的(我已经做了很多与Oracle和SQLServer) - 尝试此链接http://www.fontstuff.com /vba/vbatut04.htm – kayakpim

+0

当然,你可以在SQL中使用你自己的VBA函数(它们必须是'Public Function'),但我不太明白你想要做什么。 (子类别?类别?) – Andre

回答

2

MS访问SQL不允许这个,但VBA在那里。

你应该基本上是用你的类别和子类别2个嵌套的循环来构建你的SQL字符串

我用来收集处理猫subcats:

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,在列的别名ÿ ou应该用“&”代替“/”,而不是空白。

我做了90%的工作,你可以做其余的现在