㈠ Excel VBA sql如何多表联合查询
select abcg.型号,阶段,生产日期,生产数,不良数,销售日期,销售数量 from (select abc.型号,阶段,日期,生产日期,生产数,不良数 from (select a.型号,阶段,日期 from [表A$] a left join (select 型号,生产日期 as 日期 from [表B$] UNION select 型号,销售日期 as 日期 from [表C$]) bc on a.型号=bc.型号) abc left join (select 型号,生产日期,SUM(生产数) AS 生产数,SUM(不良数) AS 不良数 from [表B$] group by 型号,生产日期) bg ON abc.型号=bg.型号 and abc.日期=bg.生产日期) abcg left join (select 型号,销售日期,SUM(销售数量) AS 销售数量 from [表C$] group by 型号,销售日期) cg on abcg.型号=cg.型号 and abcg.日期=cg.销售日期 order by abc.型号,abc.日期
㈡ 利用SQL语句整和同文件中多张EXCEL数据
每张表的列数,或者类型不一致,union all关联的表查询类型必须一致的,列数也必须一致:
比如:
tb1 只有一个字段a 类型是整型
tb2 只有一个字段a 类型是字符型
tb3 有两个字段a(整型),b(字符型)
tb4 只有一个字段c 类型是整型
SELECT * FROM tb1 UNION ALL SELECT * FROM tb2 这行会报错
SELECT * FROM tb1 UNION ALL SELECT * FROM tb4 这行不会报错,正常执行
SELECT * FROM tb1 UNION ALL SELECT a FORM tb3 这行不会报错,正常
SELECT * FROM tb2 UNION ALL SELECT b FROM tb3 这行会报错
SELECT * FROM tb2 UNION ALL SELECT b AS a FROM tb3 这行不会报错,正常
你应该能看懂其中的规律,如果不明白就追问
㈢ Excel中如何用SQL进行多工作簿汇总
对于经常使用Excel的人来说,在Excel中使用SQL能高效处理你的数据,但据我所知Excel中的SQL语法与MySQL数据的语法还有点不一样。现在我就来实例说明如何用SQL语句对多个工作簿进行汇总。假如我们要汇总如下三个工作簿
1. 学生信息表
2. 学生成绩表
3. 学生兴趣表
将这三个工作簿按相同学号进行合并,大致分如下几步:
1. 加载数据
在Excel中,依次点击:数据-自其它来源-来自Microsoft Query-Excel Files*
然后再找到你Excel表格的存放目录,如下图
点击下面你要加载的Excel数据表,进入下面页面
将上图可用的三张表都加入到右边查询结果中的列,加入完成后点击下一步,数据就加载完成了。
2. 编写SQL代码并执行
接下来点击上面的SQL按钮开始写SQL合并代码。单纯的合并代码如下
SELECT
tm.*,
tn.兴趣爱好 AS 兴趣爱好
FROM(
SELECT
ta.学号 AS 学号,
ta.姓名 AS 姓名,
ta.年龄 AS 年龄,
ta.性别 AS 性别,
ta.身高 AS 身高,
ta.出生地 AS 出生地,
tb.语文成绩 AS 语文成绩,
tb.数学成绩 AS 数学成绩
FROM(
SELECT
tt.学号 AS 学号,
tt.姓名 AS 姓名,
tt.年龄 AS 年龄,
tt.性别 AS 性别,
tt.身高 AS 身高,
tt.出生地 AS 出生地
FROM [学生基本信息表$] tt
)ta
INNER JOIN(
SELECT
tt.学号 AS 学号,
tt.语文成绩 AS 语文成绩,
tt.数学成绩 AS 数学成绩
FROM [学生成绩表$] tt
)tb
ON ta.学号=tb.学号
)tm
INNER JOIN(
SELECT
tt.学号 AS 学号,
tt.兴趣爱好 AS 兴趣爱好
FROM [学生兴趣表$] tt
)tn
ON tm.学号=tn.学号
将代码写好后复制放入文本框中,点击确定按钮,就开始执行SQL语句。结果如下
这样就完成了三个工作簿的数据合并,接下来将数据返回Excel表。
3. 返回数据到Excel表
点击左上角的文件-将数据返回Microsoft Excel,弹出如下页面
选择数据的存放位置为新工作表,然后点击确定即可,最终得到如下数据表
这样就完成了三个工作簿的数据合并。
Tips:
1. 由于Excel中执行SQL语句时没有比较详细的报错信息,如果SQL代码语法有错误有可能执行会报错,这个问题可以上网查询或者直接在评论区问我。
2. 在Excel SQL中常用到的合并操作有INNER JOIN、LEFT JOIN、RIGHT JOIN、UNION、UNION ALL等,但不支持FULL JOIN。更复杂的需求都有一定的处理技巧。
㈣ 如何在两个EXCEL表中多条件查询
根据你的条件,我做了一下:
edit1:
学号,
edit2:
职务,
edit3:
籍贯,edit4:
面貌.与你的条件有些出入的地方是:我添加了一个radiogroup控件来让用户选择,是按学号查询还是按其他类别查询.
当选择按学号查询时,其它按钮不可用;按其它查询,edit1不可用(这个你自己可以设置是否可用.)如果edit2等中有内容即被当作查询条件,如果为空则不作查询条件.
代码大致如下:
//控制按钮是否可用:
procere
TForm1.RadioGroup1Click(Sender:
TObject);
begin
case
radiogroup1.ItemIndex
of
0:
begin
radiobutton1.Enabled
:=
false;
radiobutton2.Enabled
:=
false;
datetimepicker1.Enabled
:=
false;
datetimepicker2.Enabled
:=
false;
edit2.Enabled
:=
false;
edit3.Enabled
:=
false;
edit4.Enabled
:=
false;
end;
1:
begin
edit1.Enabled
:=
false;
radiobutton1.Enabled
:=
true;
radiobutton2.Enabled
:=
true;
datetimepicker1.Enabled
:=
true;
datetimepicker2.Enabled
:=
true;
edit2.Enabled
:=
true;
edit3.Enabled
:=
true;
edit4.Enabled
:=
true;
end;
end;
查询按钮
procere
TForm1.Button1Click(Sender:
TObject);
var
sql,
v_sex
:
string;
begin
if
radiogroup1.ItemIndex
=
0
then//按学号查询
begin
with
adoquery1
do
begin
close;
sql.Clear;
sql.Add('select
*
from
students
where
num
='''
+
trim(edit1.Text)+'''');
open;
end;
end
else
begin
sql
:=
'select
*
from
students
where
';
if
trim(edit2.Text)
<>
''
then
sql
:=
sql
+
'ty
=
'
+
Ansiquotedstr(edit2.Text,
#39);
if
trim(edit3.Text)
<>
''
then
begin
if
trim(edit2.Text)
=
''
then
sql
:=
sql
+
'nation='
+
Ansiquotedstr(edit3.Text,
#39)
else
sql
:=
sql
+
'and
nation=
'+
Ansiquotedstr(edit3.Text,
#39);
end;
if
trim(edit4.Text)
<>
''
then
begin
if
(trim(edit2.Text)
=
'')
and
(trim(edit3.Text)
='')
then
sql
:=
sql
+
'mianmao
=
'
+
Ansiquotedstr(edit4.Text,
#39)
else
if
(trim(edit2.Text)
<>
'')
or
(trim(edit3.Text)
<>
'')
then
sql
:=
sql
+
'and
mianmao
=
'
+
Ansiquotedstr(edit4.Text,
#39);
end;
if
radiobutton1.Checked
then
begin
v_sex
:=
radiobutton1.Caption;
if
(trim(edit2.Text)
=
'')
and
(trim(edit3.Text)
='')
and
(trim(edit4.Text)
=
'')
then
sql
:=
sql
+
'sex
='
+
Ansiquotedstr(radiobutton1.Caption,
#39)
else
if
(trim(edit2.Text)
<>
'')
or
(trim(edit3.Text)
<>
'')
or
(trim(edit4.Text)
<>
'')
then
sql
:=
sql
+
'and
sex
='
+
Ansiquotedstr(radiobutton1.Caption,
#39);
end;
if
radiobutton2.Checked
then
begin
v_sex
:=
radiobutton2.Caption;
if
(trim(edit2.Text)
=
'')
and
(trim(edit3.Text)
='')
and
(trim(edit4.Text)
=
'')
then
sql
:=
sql
+
'sex
='
+
Ansiquotedstr(radiobutton2.Caption,
#39)
else
if
(trim(edit2.Text)
<>
'')
or
(trim(edit3.Text)
<>
'')
or
(trim(edit4.Text)
<>
'')
then
sql
:=
sql
+
'and
sex
='
+
Ansiquotedstr(radiobutton2.Caption,
#39);
end;
if
(trim(edit2.Text)
=
'')
and
(trim(edit3.Text)
=
''
)
and
(trim(edit4.Text)
=
'')
and
(v_sex
=
'')
then//如果edit控件全为空,就显示所有记录,这里可以自己设置.
sql
:=
'select
*
from
students';
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.Append(sql);
adoquery1.Open;
end;
这里我没有实现日期查询,因为还不知道..(很少使用ACCESS,惭愧..)
㈤ SQL查询两个工作表不同的数据项,不汇总,计算存货周转率
将多个表中的数据汇总最常用的办法是使用union all,具体的要视表结构、“相同属性”的具体定义、汇总方式等因素而定,可能还要用到连接、筛选、子查询、分组等手段,当然聚合函数sum是少不了的。
下面例子实现将t1,t2,t3中的各个产品汇总起来,显示每种产品的总量:
select t.proct ,sum(t.qty) from
(select proct,qty from t1
union all
select proct,qty from t2
union all
select proct,qty from t3) t
group by t.proct;
㈥ excel SQL多表查询问题
select 日期,存货名称,单价,金额 from [2010$] where 存货名称 like '%电机%'
union
select 日期,存货名称,单价,金额 from [2011$] where 存货名称 like '%电机%'
union
select 日期,存货名称,单价,金额 from [2012$] where 存货名称 like '%电机%'
union
select 日期,存货名称,单价,金额 from [2013$] where 存货名称 like '%电机%'
㈦ 如何用SQL语句查询Excel数据
在通过ADO对Excel对象进行连接时(此时Excel则认为是一个数据源),需要配置对Excel数据源对应的连接串,这个连接串中包括了Provider信息(其实类似对数据库进行连接操作时,都需要指定连接字符串),以下是一行连接串源代码: strConnString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strExcelFilePath & ";Extended Properties=Excel 12.0" 这里的Provider使用了Microsoft.ACE.OLEDB.12.0,其实除了Microsoft.ACE.OLEDB.12.0,还有Microsoft.Jet.OLEDB.4.0,它们俩者之间有什么联系和区别呢: 共同点:都是做为连接Excel对象的接口引擎 不同点: 对于不同的Excel版本,有两种接口可供选择:Microsoft.Jet.OLEDB.4.0(以下简称 Jet 引擎)和Microsoft.ACE.OLEDB.12.0(以下简称 ACE 引擎)。 Jet 引擎,可以访问 Office 97-2003,但不能访问 Office 2007。 ACE 引擎是随 Office 2007 一起发布的数据库连接组件,既可以访问 Office 2007,也可以访问 Office 97-2003。 另外:Microsoft.ACE.OLEDB.12.0 可以访问正在打开的 Excel 文件,而 Microsoft.Jet.OLEDB.4.0 是不可以的。 所以,在使用不同版本的office时,要注意使用合适的引擎。 A:下列语句可在SQL SERVER中查询Excel工作表中的数据。 2007和2003都可用 SELECT * FROM OpenDataSource( 'Microsoft.ACE.OLEDB.12.0','Data Source="D:\test1.xls";User ID=Admin;Password=;Extended properties="Excel 12.0 Xml;HDR=YES;IMEX=1";')...[Sheet1$] 2007和2010版本: SELECT * FROM OpenDataSource( 'Microsoft.ACE.OLEDB.12.0', 'Data Source="c:\book1.xlsx";User ID=Admin;Password=;Extended properties=Excel 12.0')...[Sheet1$] SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;Database=C:\book1.xlsx', 'SELECT * FROM [Sheet1$A1:D100]') SELECT * FROM OPENROWSET('Microsoft.ACE.OLEDB.12.0','Excel 12.0;Database=C:\book1.xlsx', 'SELECT * FROM [Sheet1$]') 2003版本: SELECT * FROM OpenDataSource( 'Microsoft.Jet.OLEDB.4.0', 'Data Source="c:\book1.xls";User ID=Admin;Password=;Extended properties=Excel 8.0')...[Sheet1$] SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=C:\book1.xls', 'SELECT * FROM [Sheet1$]') SELECT * FROM OPENROWSET('Microsoft.Jet.OLEDB.4.0','Excel 8.0;Database=C:\book1.xls', 'SELECT * FROM [Sheet1$A1:D100]') 而且,还需要用拥有服务器sysadmin角色权限的登录帐号,先执行下列语句打开SQL SERVER的'Ad Hoc Distributed Queries'开关。 exec sp_configure 'show advanced options',1;reconfigure; exec sp_configure 'Ad Hoc Distributed Queries',1;reconfigure; 执行查询后,再用相反顺序的语句,关闭'Ad Hoc Distributed Queries'开关。 exec sp_configure 'Ad Hoc Distributed Queries',0; reconfigure;exec sp_configure 'show advanced options',0;reconfigure
㈧ 如何使用SQL语句实现对Excel工作表数据的查询
--1.开启远程查询支持
execsp_configure'showadvancedoptions',1
reconfigure
execsp_configure'AdHocDistributedQueries',1
reconfigure
--2.链接ExcelMicrosoftACE12.0OLEDBProvider读Excel数据(注意Excel必须事先关闭)
select*from
openrowset('Microsoft.ACE.OLEDB.12.0','Excel12.0;HDR=Yes;DATABASE=C:/Users/nichk/Desktop/data.xls',Sheet1$);
--3.记得用完选项后,关闭这些选项
execsp_configure'AdHocDistributedQueries',0
reconfigure
execsp_configure'showadvancedoptions',0
reconfigure
--4.查看是不是关闭
execsp_configure
记得电脑必须安装oledb提供程序(可搜索AccessDatabaseEngine.exe在微软官网下载安装),不同的版本访问方式不一样,如下是各版本的访问方式:
-->Jet引擎访问Excel97-2003
select*fromOpenRowSet('Microsoft.Jet.OLEDB.4.0','Excel8.0;HDR=Yes;IMEX=1;Database=D:/97-2003.xls','select*from[Sheet1$]')
select*fromOpenRowSet('Microsoft.Jet.OLEDB.4.0','Excel8.0;HDR=Yes;IMEX=1;Database=D:/97-2003.xls',[Sheet1$])
select*fromOpenDataSource('Microsoft.Jet.OLEDB.4.0','Excel8.0;HDR=Yes;IMEX=1;Database=D:/97-2003.xls')...[Sheet1$]
select*fromOpenDataSource('Microsoft.Jet.OLEDB.4.0','DataSource=D:/97-2003.xls;ExtendedProperties="Excel8.0;HDR=Yes;IMEX=1"')...[Sheet1$]
-->ACE引擎访问Excel97-2003
select*fromOpenRowSet('Microsoft.ACE.OLEDB.12.0','Excel12.0;HDR=Yes;IMEX=1;Database=D:/97-2003.xls','select*from[Sheet1$]')
select*fromOpenRowSet('Microsoft.ACE.OLEDB.12.0','Excel12.0;HDR=Yes;IMEX=1;Database=D:/97-2003.xls',[Sheet1$])
select*fromOpenDataSource('Microsoft.ACE.OLEDB.12.0','Excel12.0;HDR=Yes;IMEX=1;Database=D:/97-2003.xls')...[Sheet1$]
select*fromOpenDataSource('Microsoft.ACE.OLEDB.12.0','DataSource=D:/97-2003.xls;ExtendedProperties="Excel12.0;HDR=Yes;IMEX=1"')...[Sheet1$]
-->ACE引擎访问Excel2007
select*fromOpenRowSet('Microsoft.ACE.OLEDB.12.0','Excel12.0;HDR=Yes;IMEX=1;Database=D:/2007.xlsx','select*from[Sheet1$]')
select*fromOpenRowSet('Microsoft.ACE.OLEDB.12.0','Excel12.0;HDR=Yes;IMEX=1;Database=D:/2007.xlsx',[Sheet1$])
select*fromOpenDataSource('Microsoft.ACE.OLEDB.12.0','Excel12.0;HDR=Yes;IMEX=1;Database=D:/2007.xlsx')...[Sheet1$]
select*fromOpenDataSource('Microsoft.ACE.OLEDB.12.0','DataSource=D:/2007.xlsx;ExtendedProperties="Excel12.0;HDR=Yes;IMEX=1"')...[Sheet1$]
㈨ 怎么合并这两张Excel表
将有专业课绩点的sheet命名为“专业课绩点”,将有总绩点的sheet命名为“总绩点”
如果是excel2016及以上版本,将鼠标定位到“专业课绩点”的sheet数据区域,点击【数据】选项卡,选择【来自于区域/表格】,建立一个查询:
提取码: 62cr