2016-08-23 99 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%的工作,你可以做其餘的現在