Excel聚合功能

use*_*543 7 sql excel oracle11g

我有一个带列的excel文件,

C_IP
SESSION_ID
CS_USER_AGENT
CS_URI_STEM
CS_URI_QUERY
WEB_LINK
Run Code Online (Sandbox Code Playgroud)

由于Oracle(11g)中允许的字符串大小的限制,我无法聚合上述属性.我试图使用用户定义的聚合函数.我想聚合"WEB_LINK"列,并按C_IP进行分组.是否可以在Excel中执行此操作?

我试图使用的SQL查询是,

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;
Run Code Online (Sandbox Code Playgroud)

Sid*_*and 2

我什至没有听说过这个COLLECT()功能,直到我在这个问题中看到它,但它看起来非常有用。根据我所读到的内容,我认为以下内容应该将您的 Excel 工作表减少为唯一行,同时聚合 web_link 列。它不会即时执行此操作(这可能是您正在寻找的),但一旦数据存在,您就可以在整个工作表上运行它。

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
Run Code Online (Sandbox Code Playgroud)