모든 열을 개별적으로 UNION보다 데이터를 재구성하는 더 효율적인 방법은 무엇입니까? (접근 제한)

LaurensP

4 개의 열이있는 테이블로 재구성되어야하는 테이블 (200 행 * 77 열)이 있습니다. UNION으로 가능해야하지만, 결국 75 개의 UNION 문으로 끝납니다. msAccess2007은 예외가 아닙니다. 또한 Excel에서 코드를 함께 연결하더라도 구성하는 것이 귀찮습니다. (내 코드를 두 블록으로 실행하면 제대로 작동합니다.)

그렇다면 Access가 코드를 처리하고 작성하기 더 쉽게 코드를 짧게 만드는 방법이 있습니까?

예제 데이터

ID      Var1_1  Var2_1  Var2_2      Var2_3
C2816   45654           5.050551    4.050
B2811           5.98    
C2814   453     1.52        
C2819   4               3.06141     6.8845
B291    53                          2.2

결과는 어떻게 보일까요

ID      ContentGroup Content    Volume
C2816   Var1         Var1_1     45654
C2816   Var2         Var2_2     5.050505051
C2816   Var2         Var2_3     4.05
B2811   Var2         Var2_2     5.98
C2814   Var1         Var1_1     453
C2814   Var2         Var2_1     1.52

예제 코드

SELECT [tbl].ID, "Var1" AS ContentGroup, "Var1_1" AS Content, [tbl]![Var1] AS Volume 
FROM tbl 
WHERE ((([tbl]![Var1_1]) Is Not Null)) 
UNION 
SELECT [tbl].ID, "Var2" AS ContentGroup, "Var2_1" AS Content, [tbl]![Var2_1] AS Volume 
FROM tbl 
WHERE ((([tbl]![Var2_1]) Is Not Null)) 
UNION 
SELECT [tbl].ID, "Var2" AS ContentGroup, "Var2_2" AS Content, [tbl]![Var2_2] AS Volume 
FROM tbl 
WHERE ((([tbl]![Var2_2] Is Not Null)) 
UNION 
SELECT [tbl].ID, "Var" AS ContentGroup, "Var2_3" AS Content, [tbl]![Var2_3] AS Volume 
FROM tbl 
...

나는 SELECT * FROM (모든 공용체) WHERE (Content Is Not Null); 이것은 해결책이 아니며 작동하지 않으며 구성하기가 거의 쉽지 않습니다.

저는 Var로 시작하는 열을 선택하는 방향으로 생각하고 있습니다. varname AS ContentGroup의 처음 4 개 문자 인 varname AS Content를 사용하지만 어떻게해야할지 모르겠습니다.

브래드

이 작업을 한 번 수행하므로 할 수 있습니다. 데이터를 Excel에 넣습니다 (xls가 아닌 xlsx).

나는 이와 같은 많은 데이터를 얻고 있었기 때문에 Excel에서 데이터를 피벗 해제하기 위해이 절차를 잠시 작성했습니다. 이 함수가 수행하는 작업은 여러 통합 범위 ( alt+ d, p)를 만든 다음 오른쪽 하단의 총 합계 셀을 두 번 클릭 할 때와 동일 합니다.

"|"로 분할 할 추가 비트가 있습니다. 때로는 고유하게 ID를 지정하는 레코드 (사이트 및 날짜 ..)가 많기 때문에 새 열을 만듭니다.

실행하면 범위 (모든 데이터)를 선택하고 Enter 키를 누르라는 메시지가 표시됩니다. 해당 데이터를 피벗 테이블로 변환하고 총 보조금에 대한 "세부 정보 표시"를 수행합니다. 그런 다음 피벗 테이블 시트를 삭제하고 새롭고 정규화 된 데이터를 남깁니다.

괜찮아 보이면 다시 액세스로 가져옵니다. left기능을 사용하여 Var1_1->Var1

귀하의 데이터가 주어지면 이것이 내가 얻은 결과입니다.

Row Column  Value
B2811   Var1_1  5.98
B2811   Var2_1  
B2811   Var2_2  
B2811   Var2_3  
B291    Var1_1  53
B291    Var2_1  2.2
B291    Var2_2  
B291    Var2_3  
C2814   Var1_1  453
C2814   Var2_1  1.52
C2814   Var2_2  
C2814   Var2_3  
C2816   Var1_1  45654
C2816   Var2_1  5.050551
C2816   Var2_2  4.05
C2816   Var2_3  
C2819   Var1_1  4
C2819   Var2_1  3.06141
C2819   Var2_2  6.8845
C2819   Var2_3  

.

Sub UnpivotData()
    Dim OBJECT_REQUIRED_ERROR As Integer, UNABLE_TO_SHOW_DETAIL_ERROR As Integer
    OBJECT_REQUIRED_ERROR = 424
    UNABLE_TO_SHOW_DETAIL_ERROR = 1004

    Dim sourceRange As Range, sourceSheet As Worksheet
    On Error Resume Next
    Set sourceRange = Application.InputBox("Select cell(s)", Type:=8, Title:="Select range to unpivot...")
    If Err.Number = OBJECT_REQUIRED_ERROR Then
        Exit Sub
    End If
    On Error GoTo 0
    Application.ScreenUpdating = False
    Dim fullRangeAddress As String
    fullRangeAddress = "'" & sourceRange.Worksheet.Name & "'!" & sourceRange.Address(ReferenceStyle:=xlR1C1, external:=False)

    Dim pvtchache  As PivotCache, newPivotTable As PivotTable
    Set pvtchache = sourceRange.Worksheet.Parent.PivotCaches.Create(SourceType:=xlConsolidation, SourceData:=Array(fullRangeAddress), Version:=xlPivotTableVersion14)
    Set newPivotTable = pvtchache.CreatePivotTable(TableDestination:="", DefaultVersion:=xlPivotTableVersion14)            'TableName:="PivotTable2",

    Dim pivotWorksheet As Worksheet, numberOfNewColumns As Integer, detailWorksheet As Worksheet

    Set pivotWorksheet = ActiveSheet  'the last function will make this the active worksheet as default behavior
    On Error Resume Next
    pivotWorksheet.Cells(newPivotTable.RowRange.Rows.Count + 1, newPivotTable.ColumnRange.Columns.Count + 1).ShowDetail = True    'go to the bottom right corner (grand grand total)
    If Err.Number = UNABLE_TO_SHOW_DETAIL_ERROR Then
        MsgBox "Could not find the Grand Total cell. You'll have to double click it yourself to finish."
    End If

    Set detailWorksheet = ActiveSheet
    numberOfNewColumns = Len(detailWorksheet.Range("A2")) - Len(Replace(detailWorksheet.Range("A2"), "|", ""))

    Dim i As Integer
    Do While i < numberOfNewColumns
        detailWorksheet.Columns(2).Insert
        i = i + 1
    Loop

    Dim txtToColsRange As Range
    With detailWorksheet
        Application.DisplayAlerts = False
        .Range("A1") = sourceRange.Cells(1, 1)
        Set txtToColsRange = .Range(.Range("A1"), .Range("A1").End(xlDown))
    End With
    txtToColsRange.TextToColumns DataType:=xlDelimited, _
        TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=False, _
        Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar:="|", _
        FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True

    detailWorksheet.Cells.EntireColumn.AutoFit

    pivotWorksheet.Delete
    Application.DisplayAlerts = True
    Application.ScreenUpdating = True
End Sub

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관