본문 바로가기
ADO

[ADO] sql : Pivot 함수를 이용하자

by 일등미노왕국 2022. 6. 1.

sql 문법중 Pivot 함수를 이용하여 월별 매출을 출력하는 구문을 만들어보자

 

sql 구문은 정규식의 패턴을 형성하는 것과 같기에 정확한 sql 문법을 찾아내는게 가장 중요하다

sql 구문의 집계함수들은 SELECT 함수보다 먼저 와야 한다.

또한 TRANSFORM과 PIVOT함수는 같이 페어링 된다.

https://stackoverflow.com/questions/16691853/transform-and-pivot-in-access-2013-sql

 

TRANSFORM and PIVOT in Access 2013 SQL

How can I get second table from first table using TRANSFORM and PIVOT functions: TABLE_01 Config_ID | ConfigField | ConfigValue ----------------------------------------- 11 | ...

stackoverflow.com

구문해석은 이렇다.

박스오피스 시트에 있는 영화명을 그룹으로 묶어서 매출액의 합계를 내는데 개봉일의 월별 계산을 위해

피벗함수를 사용해라...

이걸 피벗함수를 사용하지 않는다면 코드가 많이 복잡해 질것이다. SQL문으로 단 한줄로 끝나기에 당연히 공부를 해야하는 코드이다.

 

더보기
Option Explicit

Sub Haja_Guid_Pivot()

    Dim StrGuid$: StrGuid = "{B691E011-1797-432E-907A-4D8C69339129}" '= ADODB참조
    
    On Error Resume Next
        ThisWorkbook.VBProject.References.AddFromGuid StrGuid, 0, 0 '= 가장 최신버전
    On Error GoTo 0
    
    Call Haja_Adodb_Pivot

End Sub

Sub Haja_Adodb_Pivot()

    Dim Rs As New ADODB.Recordset
    Dim strPath$
    Dim strSQL$, strConn$
    Dim strYear&
    Dim i&
    
    strPath = ThisWorkbook.FullName
    
    strConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
              "Data Source=" & strPath & ";" & _
              "Extended Properties=Excel 12.0;"
              
    strYear = Sheets("박스오피스").[m2]          '= 변경하는 년도 값
    
    strSQL = " TRANSFORM SUM(매출액) " & _
             " SELECT 영화명 " & _
             " FROM [박스오피스$] " & _
             " WHERE mid(right(영화명,5),1,4) = " & strYear & _
             " GROUP BY 영화명 " & _
             " PIVOT FORMAT(개봉일 ,'mm') & '월' "

    Rs.Open strSQL, strConn
    
    With Sheets("연도별")
        
        .Cells.Clear
        
        For i = 0 To Rs.Fields.Count - 1
        
            .Cells(1, i + 1) = Rs.Fields(i).Name
        Next i
    
        If Rs.EOF Then
            MsgBox "조건에 맞는 데이터가 없습니다."
            Rs.Close
            Set Rs = Nothing
            Exit Sub
        Else
            .[a2].CopyFromRecordset Rs
           
        End If

           With .UsedRange
                .NumberFormat = "#,##0"
                 Sheets("박스오피스").[a1].Copy
                 Range(Sheets("연도별").[a1], Sheets("연도별").[a1].End(2)).PasteSpecial Paste:=xlPasteFormats
                 Sheets("연도별").[a1].CurrentRegion.Borders.LineStyle = 1
                .Font.Size = 9
                .Columns.AutoFit
                Sheets("연도별").Activate
           End With
           
      End With
         
    Rs.Close
    Set Rs = Nothing
End Sub

영화.xlsm
0.05MB

댓글