2016-08-23 18 views
2

私はExcelで条件付きクエリをコード化しようとしているのがうんざりしていたので、今はAccessを使用してSQLでダビングしています。あなたは以下を参照として、あなたが見ることができるように列名が、そんなに機能のように、私はMS Access 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, 

...、私の冗長コードを減らすためにCountSubCategories(カテゴリ)のような何かをすることによって、綿毛をクリーンアップしたいと思います同じカテゴリのサブカテゴリが親カテゴリに存在するので、どのように関数を事前に定義し、変数としてカテゴリを呼び出すことができますか?

ありがとうございます!

+0

ことが可能であるように思わあなたは残りの部分を行うことができ、作業の90%を作った - http://www.fontstuff.comこのリンクを試します/vba/vbatut04.htm – kayakpim

+0

もちろん、SQLで独自のVBA関数を使用することもできます(それらは 'Public Function'でなければなりません)。しかし、私はあなたがしたいことを本当に理解していません。 (サブカテゴリ?カテゴリ?) – Andre

答えて

2

MSアクセスSQLはこれを許可しませんが、VBAはあります。

あなたは基本的に私は猫とSUBCATSを処理するために、コレクションを使用し、あなたのSQL文字列

を構築するためにあなたのカテゴリとサブカテゴリに2つのネストされたループを使用する必要があります

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, 

あなたは、列の別名yに、あなたのコラムWO/SC用としていくつかの適応を行う必要があります"/"をスペースの代わりに "&"に置き換える必要があります。

私は(私はそれをOracleやSQLServerの持つたくさんやった)今

関連する問題