簡體   English   中英

是否可以使用 SQL 之類的語法從 Excel 中的另一個表創建一個表?

[英]Is it possible to create a table from another table in Excel using SQL like syntax?

我在 excel 中有一個表格,每個日期有多行。 我想創建一個新表,按日期以及其他一些維度分組並匯總 net_revenue。

在 sql 中很簡單:

SELECT send_date,
   week_day,
   after_hours,
   discount_type,
   sum(net_revenue
FROM this_table
GROUP BY send_date,
   week_day,
   after_hours,
   discount_type

在 excel 中是否有一種簡單的方法可以做到這一點? 起初我以為 pivot 表,但我不希望每個附加維度都在新行上。

這是我當前的表的樣子:

這就是我的原始表的樣子

考慮以下嚴格的 GUI 界面解決方案:

  1. 將所有分組字段按原樣復制到單獨的工作表中。
  2. 在功能區的數據選項卡下,單擊刪除重復項,選擇所有列。
  3. 在最后一列中,運行SUMIFS公式來計算 net_revenue 總和,指向原始工作表中的值。

     =SUMIFS(<net_revenue_column>, <1stgroup_column_in_first_sheet>, <1stgroup_value_in_second_sheet>, <2ndgroup_column_in_first_sheet>, <2ndgroup_value_in_second_sheet>, <3rdgroup_column_in_first_sheet>, <3rdgroup_value_in_second_sheet>, ... )

Alternatively, actually run SQL (if using Excel for Windows) using the JET/ACE SQL Engine (same engine of MS Access that can query Excel workbooks even CSV files). 下面假設您的數據從 A1 開始,並帶有命名列。 調整FROM子句中的工作表名稱。

Sub RunSQL()
   Dim oConn, rs As Object
   Dim strConnection, strSQL As String
   Dim i As Integer

   Set oConn = CreateObject("ADODB.Connection")
   Set rs = CreateObject("ADODB.Recordset")

   ' CONNECTION STRING ON CURRENT WORKBOOK
   strConnection = "DRIVER={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};" _
                     & "DBQ=" & ThisWorkbook.FullName & ";"

   ' OPEN DB CONNECTION
    oConn.Open strConnection

    strSQL =  "SELECT send_date,        " _
            & "       week_day,         " _
            & "       after_hours,      " _
            & "       discount_type,    " _
            & "       sum(net_revenue) AS total_revenue " _
            & " FROM [SheetName$]       " _
            & " GROUP BY send_date,     " _
            & "          week_day,      " _
            & "          after_hours,   " _
            & "          discount_type  "

    ' OPEN RECORDSET OF QUERY
    rs.Open strSQL, oConn

    ' OUTPUT DATA TO EXCEL WORKSHEET (IN EMPTY TAB NAMED "RESULTS")
    ' HEADERS
    For i = 0 To rs.Fields.Count - 1
        ThisWorkbook.Worksheets("RESULTS").Cells(1, i) = rs.Fields(i).Name
    Next i

    ' ROWS
    ThisWorkbook.Worksheets("RESULTS").Range("A2").CopyFromRecordset rs

    rs.Close: oConn.Close
    Set rs = Nothing: Set oConn = Nothing        
End Sub

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM