Excel 中如何以多列数据为准则进行查询
2008-06-25 17:39
525 查看
工作中,我们经常需要在 Excel 工作表中查找某个值。数据量少时用“Find and Replace”对话框手工找还可以对付,数据量很大或者我们需要把数据分离出来看得更清楚的话,就要用筛选或公式等手段了。
对于在单列或单行中查找数据,我们有很多现成的函数可用,比如 VLOOKUP,HLOOKUP,Match 和 Index 的组合。如果是比较多列,要满足两个或两个以上的条件怎么办呢?看一个具体的例子吧。
这是某家公司内部的销售清单,我们现在想就多列数据进行查询,以三个问题来进行说明。
问题1. 查找 2008年3月6日,张三在丝绸上的销售金额
2008/3/6 有三条销售记录,和两位销售员两种产品有关,以一列或两列数据为条件都不能得到准确的结果,必须时间、产品和销售人员三列都满足才能得到我们想要的数据。
我们先考察一下解决这种问题的思路。像VLOOKUP 这个函数,是在一列数据中逐个查找数据,查找范围是单维度的。而我们碰到的问题是多维度的,在 A2:D8 这个表结构中,在逐行扫描时还要逐列进行比较,并针对每一行的比较结果返回 True 或 False。Excel 中最通用的比较函数是 IF,我们查找的范围是个多维数组,返回的结果自然也是个数组,所以我们可以用 If 来构造一个数组函数作为参考。
选择 E2:E8 这个区域,并在 Excel 的公式栏里输入 =IF(A2:A8=A10,IF(B2:B8=B10,IF(C2:C8= C10,D2:D8,0),0),0) ,按 Ctrl+Shift+Enter。例子里 E2:E8 显示的是这个数组公式的返回结果。这个公式的意思就是,对于 A2:D8 这个表的每一行,先比较 A 列,结果为真的话就接着比较同一行的 B 列,B 列比较结果也为真的话就比较同一行的 C 列,C 列也为真的话就返回同一行 D 列的值。任何一个比较结果为 False 的话就返回 0。
对于 IF 嵌套的公式,我们有个等价的简化版 =(A2:A8=A10)*(B2:B8=B10)*(C2:C8= C10)*D2:D8,这也是个数组公式,按 Ctrl+Shift+Enter 输入。只有A,B,C 三列都满足条件才会返回 D 列的值,否则返回 0。
有了 E2:E8 这个区域的中间值,我们下一步就是利用这些值来构造我们最终的函数。有两个函数可用,一个是 SUMPRODUCT,一个是SUM。SUMPRODUCT 函数的好处是不用按 Ctrl+Shift+Enter 进行输入。如果用 SUM 函数,则一定要按 Ctrl+Shift+Enter 进行输入。我们在 D10 输入
=SUMPRODUCT((A2:A8=A10)*(B2:B8=B10)*(C2:C8=C10)*D2:D8) 就返回了满足条件的结果。
问题2. 查找 2008/1/1 到 2008/4/1,张三在丝绸上的销售总金额
这个问题是上面一个问题的扩展,A 列不是单纯的等于一个值,而是在一个范围内,实质是 A 列本身进行两次比较。选择 F2:F8 这个区域,我们的中间值可以表达成如下的数组公式:
汇总后的最终结果就是:
问题3. 查找 2008/1/1 到 2008/4/1,张三在丝绸上的销售记录数
在第一个问题里,我们对于A,B,C三列都满足条件的,返回的是 D 列的金额,在这个问题里,我们不需要返回 D 列的金额了。对于A,B,C三列都满足条件的,我们返回一个计数 1。写成公式就是:
上面讲的是我们自己设计公式的解法,逻辑和判断条件都放在一起了,自成一个体系。但是我们也看到,判断条件多的时候,公式会变得很长。Excel 本身提供了一种条件和公式分开放的解法,就是 Excel 里那些头文字“D”的 Database Function,如 DCOUNT,DSUM。对于这些数据库函数里准则的写法,可以参考在 Excel 中使用高级筛选功能。我们的三个问题可以分别用 DGET,DSUM 和 DCOUNT 来解决,具体解法我这里就不描述了。
对于在单列或单行中查找数据,我们有很多现成的函数可用,比如 VLOOKUP,HLOOKUP,Match 和 Index 的组合。如果是比较多列,要满足两个或两个以上的条件怎么办呢?看一个具体的例子吧。
A | B | C | D | E | F | |
1 | 时间 | 产品 | 销售人员 | 金额 | ||
2 | 2008-1-3 | 丝绸 | 张三 | 20000 | 0 | |
3 | 2008-2-3 | 缎子 | 李四 | 16000 | 0 | |
4 | 2008-2-19 | 棉布 | 张三 | 32000 | 0 | |
5 | 2008-3-6 | 丝绸 | 王五 | 18000 | 0 | |
6 | 2008-3-6 | 丝绸 | 张三 | 24000 | 24000 | |
7 | 2008-3-6 | 呢子 | 张三 | 11000 | 0 | |
8 | 2008-4-7 | 绒布 | 李四 | 18000 | 0 | |
9 | ||||||
10 | 2008-3-6 | 丝绸 | 张三 |
问题1. 查找 2008年3月6日,张三在丝绸上的销售金额
2008/3/6 有三条销售记录,和两位销售员两种产品有关,以一列或两列数据为条件都不能得到准确的结果,必须时间、产品和销售人员三列都满足才能得到我们想要的数据。
我们先考察一下解决这种问题的思路。像VLOOKUP 这个函数,是在一列数据中逐个查找数据,查找范围是单维度的。而我们碰到的问题是多维度的,在 A2:D8 这个表结构中,在逐行扫描时还要逐列进行比较,并针对每一行的比较结果返回 True 或 False。Excel 中最通用的比较函数是 IF,我们查找的范围是个多维数组,返回的结果自然也是个数组,所以我们可以用 If 来构造一个数组函数作为参考。
选择 E2:E8 这个区域,并在 Excel 的公式栏里输入 =IF(A2:A8=A10,IF(B2:B8=B10,IF(C2:C8= C10,D2:D8,0),0),0) ,按 Ctrl+Shift+Enter。例子里 E2:E8 显示的是这个数组公式的返回结果。这个公式的意思就是,对于 A2:D8 这个表的每一行,先比较 A 列,结果为真的话就接着比较同一行的 B 列,B 列比较结果也为真的话就比较同一行的 C 列,C 列也为真的话就返回同一行 D 列的值。任何一个比较结果为 False 的话就返回 0。
对于 IF 嵌套的公式,我们有个等价的简化版 =(A2:A8=A10)*(B2:B8=B10)*(C2:C8= C10)*D2:D8,这也是个数组公式,按 Ctrl+Shift+Enter 输入。只有A,B,C 三列都满足条件才会返回 D 列的值,否则返回 0。
有了 E2:E8 这个区域的中间值,我们下一步就是利用这些值来构造我们最终的函数。有两个函数可用,一个是 SUMPRODUCT,一个是SUM。SUMPRODUCT 函数的好处是不用按 Ctrl+Shift+Enter 进行输入。如果用 SUM 函数,则一定要按 Ctrl+Shift+Enter 进行输入。我们在 D10 输入
=SUMPRODUCT((A2:A8=A10)*(B2:B8=B10)*(C2:C8=C10)*D2:D8) 就返回了满足条件的结果。
问题2. 查找 2008/1/1 到 2008/4/1,张三在丝绸上的销售总金额
这个问题是上面一个问题的扩展,A 列不是单纯的等于一个值,而是在一个范围内,实质是 A 列本身进行两次比较。选择 F2:F8 这个区域,我们的中间值可以表达成如下的数组公式:
=((A2:A8<DATEVALUE("2008/4/1"))*(A2:A8>DATEVALUE("2008/1/1"))*(B2:B8="丝绸")*(C2:C8="张三")*D2:D8)
汇总后的最终结果就是:
=SUMPRODUCT((A2:A8<DATEVALUE("2008/4/1"))*(A2:A8>DATEVALUE("2008/1/1"))*(B2:B8="丝绸")*(C2:C8="张三")*D2:D8)
问题3. 查找 2008/1/1 到 2008/4/1,张三在丝绸上的销售记录数
在第一个问题里,我们对于A,B,C三列都满足条件的,返回的是 D 列的金额,在这个问题里,我们不需要返回 D 列的金额了。对于A,B,C三列都满足条件的,我们返回一个计数 1。写成公式就是:
=SUMPRODUCT((A2:A8<DATEVALUE("2008/4/1"))*(A2:A8>DATEVALUE("2008/1/1"))*(B2:B8="丝绸")*(C2:C8="张三")*1)
上面讲的是我们自己设计公式的解法,逻辑和判断条件都放在一起了,自成一个体系。但是我们也看到,判断条件多的时候,公式会变得很长。Excel 本身提供了一种条件和公式分开放的解法,就是 Excel 里那些头文字“D”的 Database Function,如 DCOUNT,DSUM。对于这些数据库函数里准则的写法,可以参考在 Excel 中使用高级筛选功能。我们的三个问题可以分别用 DGET,DSUM 和 DCOUNT 来解决,具体解法我这里就不描述了。
相关文章推荐
- 如何使用 ASP.NET、ADO.NET 和 Visual C# .NET 查询和显示 Excel 数据
- 如何在Excel中进行类似SQL的查询
- Excel中如何找出两列数据中相同的数据,并且进行同行显示
- SQL语句:orac 3ff0 le中如何插入Date类型的数据和根据Date数据进行查询的方法
- 在S2SH整合中如何对其多表联合查询出来的数据,进行分页和排序
- excel如何对数据进行多字段同时排序、多条件组合和多条件筛选呢
- 如何将数据库中的多表的查询数据导出到excel中
- 如何使用 ASP.NET查询和显示 Excel 数据
- 如何使用 ASP.NET、ADO.NET 和 Visual C# .NET 查询和显示 Excel 数据
- SQL 大数据查询如何进行优化?
- Oracle,PLSQL导出CVS数据,转化为Excel,如何防止数字列进行科学技术。
- Excel如何与R3进行数据交互
- 【ERP】如何在主数据块处于新建或插入状态时禁止对明细数据块进行查询数据操作
- C# 如何将 不同的数据(多个查询结果集 dataset)导出到一个excel的不同sheet中
- 如何使用 ASP.NET查询和显示 Excel 数据
- 在Excel中使用SQL语句对多个数据表进行精确筛选 (查询)
- 如何使用 ASP.NET、ADO.NET 和 Visual C# .NET 查询和显示 Excel 数据
- jsp里对excel数据进行查询操作
- 如何用SQL语句查询Excel数据?
- 如何用SQL语句查询Excel数据?