2012-12-19 8 views
7

ich habe eine Excel mit Spalten-Datei,Excel Aggregieren Funktion

C_IP 
SESSION_ID 
CS_USER_AGENT 
CS_URI_STEM 
CS_URI_QUERY 
WEB_LINK 

Ich bin nicht in der Lage, die oben genannten Attribute aufgrund der Einschränkungen der Strings Größe in Oracle (11g) erlaubt zu aggregieren. Ich habe versucht, eine benutzerdefinierte Aggregierungsfunktion zu verwenden. Ich möchte die Spalte "WEB_LINK" aggregieren und nach C_IP gruppieren. Ist es möglich, dies in Excel zu tun?

Die SQL-Abfrage Ich habe versucht, zu verwenden war,

CREATE TABLE WEBLOG_AGG AS 
SELECT C_IP, 
tab_to_string(CAST(COLLECT(WEB_LINK) AS T_VARCHAR2_TAB)) AS WEBLINKS 
FROM WEBLOG_SESSION 
GROUP BY C_IP; 

Antwort

2

ich nicht einmal der COLLECT() Funktion gehört hatte, bis ich es in dieser Frage sah, aber es sieht sehr nützlich. Basierend auf dem, was ich gelesen habe, denke ich, dass das folgende Beispiel Ihr Excel-Arbeitsblatt auf eindeutige Zeilen reduzieren sollte, während die web_link-Spalte aggregiert wird. Es wird nicht im Handumdrehen ausgeführt (was vielleicht das ist, wonach Sie suchen), aber Sie können es auf dem ganzen Blatt ausführen, sobald die Daten dort sind.

Public Type Entry 
    C_IP As String 
    rowNum As Integer 
End Type 

Public entryList() As Entry 

Sub AggregateRows() 

    Dim lastRow As Integer 
    Dim i As Integer 
    Dim webLinks As String 
    Dim entryItem As Entry 
    Const C_IPColumn As Integer = 1   ' This is the column number of the C_IP column 
    Const WEB_LINKColumn As Integer = 6  ' This is the column number of the WEB_LINK column 

    ReDim entryList(0) 

    ' Get the last used row on the sheet 

    lastRow = ActiveSheet.Cells.Find("*", SearchOrder:=xlByRows, LookIn:=xlValues, SearchDirection:=xlPrevious).Row 

    ' Loop through all of the rows 

    For i = 1 To lastRow 

     ' See if we've already encountered the C_IP in this row 

     entryItem = GetEntry(ActiveSheet.Cells(i, C_IPColumn).Value) 

     If Not entryItem.C_IP = "" Then 

      ' We have, so add the current web link to the list for the row associated with this C_IP 

      webLinks = ActiveSheet.Cells(entryItem.rowNum, WEB_LINKColumn).Value 
      webLinks = webLinks & ", " & ActiveSheet.Cells(i, WEB_LINKColumn).Value 
      ActiveSheet.Cells(entryItem.rowNum, WEB_LINKColumn).Value = webLinks 

      ' Now remove this row (since it has been grouped with row with the same C_IP) 

      ActiveSheet.Rows(i).Delete 

      ' Decrement our counters by 1 since we have 1 fewer rows (assuming we're not on the last row already) 

      If Not i = lastRow Then 

       i = i - 1 
       lastRow = lastRow - 1 

      End If 

     Else 

      ' We've not encountered this C_IP yet, so add it to the list 

      ReDim Preserve entryList(UBound(entryList) + 1) 
      entryList(UBound(entryList)).C_IP = ActiveSheet.Cells(i, C_IPColumn).Value 
      entryList(UBound(entryList)).rowNum = i 

     End If 

    Next i 

End Sub 

' Returns the Entry matching the passed-in C_IP 
Function GetEntry(C_IP As String) As Entry 

    Dim i As Integer 

    ' Loop through all stored entries and return the first whose C_IP matches that passed in 

    For i = 0 To UBound(entryList) 
     If entryList(i).C_IP = C_IP Then 
      GetEntry = entryList(i) 
     End If 
    Next i 

End Function 

' A quick and dirty way to get an empty Entry 
Function GetEmptyEntry() As Entry 

End Function 
3

Ich denke, es wäre einfacher, Verkettung in clob auszuführen als VBA-Code zu schreiben.

15:34:36 [email protected]> create table t1 (group_col number, value varchar2(1 byte)); 

Table created. 

Elapsed: 00:00:00.10 
15:34:38 [email protected]> insert into t1 
15:35:34 2 select 1, decode(mod(rownum,5), 0,0,1) from dual connect by rownum <= 4001 
15:36:20 3 union all 
15:36:22 4 select 2, decode(mod(rownum,5), 0,0,1) from dual connect by rownum <= 4001 
15:36:27 5 ; 

8002 rows created. 

Elapsed: 00:00:00.05 
15:36:28 [email protected]> commit; 

Commit complete. 

Elapsed: 00:00:00.02 
15:36:31 [email protected]> create type t_varchar2_tab is table of varchar2(1); 
15:37:11 2/

Type created. 

Elapsed: 00:00:00.50 
15:38:15 [email protected]> ed 
Wrote file S:\tools\buffer.sql 

    1 create function tab_to_str(tab in t_varchar2_tab) return clob 
    2 as 
    3 result clob; 
    4 begin 
    5 for i in tab.first .. tab.last loop 
    6  result := result || tab(i); 
    7 end loop; 
    8 return result; 
    9* end; 
15:38:46 [email protected]>/

Function created. 

Elapsed: 00:00:00.19 
15:46:01 [email protected]> select group_col 
15:46:04 2 ,length(tab_to_str(cast(collect(value) as t_varchar2_tab))) len 
15:46:10 3 ,substr(tab_to_str(cast(collect(value) as t_varchar2_tab)), 1, 20) val 
15:46:12 4 from t1 group by group_col; 

GROUP_COL LEN VAL 
---------- ------ -------------------- 
     1 4001 11011110111101111011 
     2 4001 11011110111101111011 

Elapsed: 00:00:01.13