【问题标题】:Can I use an SQL statement to extract data from sheet A + sheet B and dump in in sheet C using only Excel我可以使用 SQL 语句从工作表 A + 工作表 B 中提取数据并仅使用 Excel 转储到工作表 C 中吗
【发布时间】:2013-10-23 15:28:40
【问题描述】:

我在 Excel 中有这样的数据

table Cost_per_period
---------------------
ProjectId
FaseID
Period
Percentage

table cost_per_partner_per_fase
-------------------------------
ProjectID
FaseID
PartnerID
Amount

table partners
--------------
PartnerID
name

这是我想要的输出。

                 2012             2013                2014     2015
Project  fase    jan  feb ... dec  Q1    Q2   Q3   Q4  wholeY  wholeY
------------------------------------------------------------------------
A310     1       100k 20k     10k  100k   -   10k  10k 1000k   2000k
A310     2       110k   -     20k   99k   -   40k  50k 5000k   3000k
......

为了结合这些数据,我正在考虑做一个类似的 SQL 语句

SELECT cp.projectID, cp.faseID
  , case when cp.period between '2012/01/01' and '2012/01/31' 
         THEN sum(cpf.amount)*cp.percentage as jan2012 end
  , case when ..... as feb2012 end
  , case .......
FROM cost_per_period as cp
INNER JOIN cost_per_partner_per_fase as cpf 
  on (cp.postjectid = cpf.projectid) and (cp.faseid = cpf.faseid)
GROUP BY cp.Projectid, cp.faseid
ORDER BY cp.ProjectID, cp.FaseID

我可以只使用 Excel 吗?我使用的是 excel 2007

【问题讨论】:

  • 您可以使用不支持CASE 的 Access 数据库引擎(Jet、ACE 等)查询 Excel 工作簿。而是使用IIF(cp.period between CDATE('2012/01/01') and CDATE('2012/01/31'), sum(cpf.amount)*cp.percentage, NULL) as jan2012
  • @onedaywhen,太好了,这就是我要说的。

标签: sql excel excel-2007 vba


【解决方案1】:

下面是针对 Excel 的最简单的查询,可以帮助您入门:

Sub test()
  Dim rs As Object
  Set rs = CreateObject("ADOR.Recordset")
  rs.Open _
      "SELECT CompanyName FROM Customers;", _
        "Provider=Microsoft.Jet.OLEDB.4.0;" & _
        "Data Source=C:\Tempo\db.xls;" & _
        "Extended Properties='Excel 8.0;HDR=Yes;IMEX=1'"
    Sheet3.Range("A1").CopyFromRecordset rs
  End Sub

【讨论】:

  • 我必须使用命名范围来告诉 Excel 表格中有哪些单元格?
  • 您可以使用工作表名称(例如[Sheet1$])和范围地址(例如整列[Sheet1$A:B] 或特定行/列[Sheet1$A2:B10])。更多信息可以在this answer找到。
【解决方案2】:

这取自 Excel 2007 中记录的适用于我的宏。您可以根据需要修改数据源和 SQL 查询。

ActiveWorkbook.Worksheets.Add
With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _
    "OLEDB;Provider=Microsoft.ACE.OLEDB.12.0;" _
    , "Data Source=C:\RM.xlsm;" _
    , "Jet OLEDB:Engine Type=37"), Destination:=Range("$A$1")).QueryTable
    .CommandType = xlCmdTable
    .CommandText = Array("SELECT * FROM [Sheet1$A1:B30]")

End With

【讨论】:

    【解决方案3】:

    如果数据已经在 Excel 中,则无法对其运行 SQL 查询。您只能针对 SQL 数据库运行这种代码(例如,如果您在 Access 中开始使用数据)。

    但是,您可以在 VBA 中编写一个等效函数并在 Excel 中运行它。

    我还发现这个插件可以让你对 Excel 数据执行 SQL:http://www.querycell.com/ 但它不是免费的,我不知道它有多好。

    【讨论】:

    • 感谢回复,我可以使用Excel作为ODBC源,为什么不能从Excel中选择?
    • 您可以使用 Access 数据库引擎(Jet、ACE 等)查询 Excel 工作簿,例如在Extended Properties 中使用 Jet 或 ACE 的 OLE DB 提供程序和 Excel(请参阅我的答案以获取简短示例)。
    猜你喜欢
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多