Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我是否可以使用SQL语句从工作表A+工作表B中提取数据,并仅使用Excel转储到工作表C中_Sql_Excel_Excel 2007_Vba - Fatal编程技术网

我是否可以使用SQL语句从工作表A+工作表B中提取数据,并仅使用Excel转储到工作表C中

我是否可以使用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 这是我想要的输出

我在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,如果数据已经在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]。有关详细信息,请参阅。