我是否可以使用SQL语句从工作表A+工作表B中提取数据,并仅使用Excel转储到工作表C中
我在Excel中有这样的数据我是否可以使用SQL语句从工作表A+工作表B中提取数据,并仅使用Excel转储到工作表C中,sql,excel,excel-2007,vba,Sql,Excel,Excel 2007,Vba,我在Excel中有这样的数据 table Cost_per_period --------------------- ProjectId FaseID Period Percentage table cost_per_partner_per_fase ------------------------------- ProjectID FaseID PartnerID Amount table partners -------------- PartnerID name 这是我想要的输出
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,如果数据已经在Excel中,您不能对其运行SQL查询。您只能在SQL数据库上运行这种代码,例如,如果您首先可以访问数据 但是,您可以在VBA中编写等效函数并在Excel中运行该函数 我还发现了这个插件,它可以让您对Excel数据执行SQL:
但它不是免费的,我不知道它有多好。下面是对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 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
您可以使用Access数据库引擎Jet、ACE查询Excel工作簿,无论它是否支持大小写,例如,使用IIFcp.period介于CDATE'2012/01/01'和CDATE'2012/01/31'之间,sumcpf.amount*cp.percentage,空值为2012年1月。@onedaywhen,太好了,这就是我要说的内容。感谢您的回复,我可以使用Excel作为ODBC源,那么为什么我不能从Excel中进行选择呢?您可以使用Access数据库引擎Jet、ACE查询Excel工作簿,例如,在扩展属性中使用Jet的OLE DB提供程序或Excel的ACE。请参阅我的答案,以获得一个简短的示例。我必须使用命名范围来告诉Excel表中的单元格。您可以使用工作表名称,例如。[Sheet1$]和范围地址,例如整列[Sheet1$A:B]或特定行/列[Sheet1$A2:B10]。有关详细信息,请参阅。