
下面的例子就是小编在实际工作中遇到的一个例子。
有这样一个问题:某电器零售集团的一个子公司的五个零售门店有以下导购人员的明细,分别在5个不同的工作表中。
Number为序号;
Section Group为科/组;
Personnelnumber为员工编号;
Personnelname为员工姓名;
Brandname为品牌名称;
Storesname为门店名称。
现要统计以下数据:
1、对于Personnelnumber进行计数,即为Fulltimecounts(正适人员的数量);
2、对于Personnelname进行计数,即为Parttimecounts(临时人员的数量);
3、对于Storesname、Section Group、Brandname三者一样的只计数一次,也就是说这三个字段的值连接起来,如果有重复的,只对其中的一条进行计数作为品牌数量Brandcounts。
原始数据表如下:

要实现的效果如下图:

分析:
上面的问题,在分析的时候,对于Fulltimecounts与Parttimecounts可以利用数据透视表进行计数(一次性完成),但是对于Storesname、Section Group、Brandname这三者进行去重按条件Storesname进行统计,需要我们手工去做三四个透视表然后再二次处理数据后使用数据透视表才能做出来;另外对于多个表的合并的统计不再适合于透视表的多重区域合并计算。
那么对于这类问题可以在Excel中使用SQL进行数据的统计,一次完成,后期如果数据有更改了还可以进行刷新,一劳永逸。
具体的操作如下:
首先单击【数据】-【现有连接】-【浏览更多】找到需要合并统计的工作簿,选中并打开。如下图:

然后在弹出的对话框中选择任意一个工作表,然后单击【确定】,在弹出的对话框中选择【属性】,如下图:


接着在弹出的对话框中选择【定义】,在【命令文本】中输入SQL语句,最后单击【确定】。如下图:

最后的效果图如文章开头的效果图所示.
具体的SQL语句如下:
SELECT a.Storesname, a.Fulltimecounts, a.Parttimecounts, b.Brandcounts
FROM (
SELECT Storesname, COUNT(Personnelname) AS Parttimecounts, COUNT(Personnelnumber) AS Fulltimecounts
FROM (
SELECT "玫瑰花园店" AS Storesname, *
FROM [玫瑰花园店$]
UNION ALL
SELECT "圣马丁路桥店" AS Storesname, *
FROM [圣马丁路桥店$]
UNION ALL
SELECT "音乐广场店" AS Storesname, *
FROM [音乐广场店$]
UNION ALL
SELECT "新世界百货店" AS Storesname, *
FROM [新世界百货店$]
UNION ALL
SELECT "凤凰古城店" AS Storesname, *
FROM [凤凰古城店$]
)
GROUP BY Storesname
) a, (
SELECT Storesname, COUNT(cunt) AS Brandcounts
FROM (
SELECT DISTINCT Storesname
, Storesname & "-" & [Section Group] & "-" & Brandname AS cunt
FROM (
SELECT "玫瑰花园店" AS Storesname, *
FROM [玫瑰花园店$]
UNION ALL
SELECT "圣马丁路桥店" AS Storesname, *
FROM [圣马丁路桥店$]
UNION ALL
SELECT "音乐广场店" AS Storesname, *
FROM [音乐广场店$]
UNION ALL
SELECT "新世界百货店" AS Storesname, *
FROM [新世界百货店$]
UNION ALL
SELECT "凤凰古城店" AS Storesname, *
FROM [凤凰古城店$]
)
)
GROUP BY Storesname
) b
WHERE a.Storesname = b.Storesname
解析:
其中:
1、SQL语句:
SELECT "玫瑰花园店" AS Storesname, *
FROM [玫瑰花园店$] UNION ALL
SELECT "圣马丁路桥店" AS Storesname, *
FROM [圣马丁路桥店$] UNION ALL
SELECT "音乐广场店" AS Storesname, *
FROM [音乐广场店$] UNION ALL
SELECT "新世界百货店" AS Storesname, *
FROM [新世界百货店$] UNION ALL
SELECT "凤凰古城店" AS Storesname, *
FROM [凤凰古城店$]
是将以上几个工作表进行数据的合并,并标明工作表的来源,即工作表的名称。注意:使用union all是将字段进行合并,使用union的也能合并,但是union会把重复的值过滤掉。
2、SQL语句:
SELECT Storesname, COUNT(cunt) AS Brandcounts
FROM (
SELECT DISTINCT Storesname
, Storesname & "-" & [Section / Group] & "-" & Brandname AS cunt
FROM (…………'合并的工作表
)
)
GROUP BY Storesname
此处使用“&”符号将Storesname、Section / Group、Brandname三个字段进行连接,并使用distinct进行去重处理,然后将生成的数据源回传给COUNT进行计数,返回每个门店的三个字段不重复计数为1的数据源。
3、SQL语句:
SELECT a.Storesname, a.Fulltimecounts, a.Parttimecounts, b.Brandcounts
FROM a,b
WHERE a.Storesname = b.Storesname
由于两个表中有相同的字段为:Storesname,然后使用这两个字段将两个数据源进行连接:一个使用COUNT(Personnelname) AS Parttimecounts, COUNT(Personnelnumber) AS Fulltimecounts的数据源;另一个是COUNT(cunt) AS Brandcounts的数据源。
最后生成的我们要进行统计的表。
以上问题的解决相比于使用数据透视表:
1、SQL对于表结构的规范性要求较高;
2、熟悉SQL的连接,SQL函数使用,WHERE条件语句使用,SQL语句嵌套;
3、数据透视表不能处理多维数据,需要降维处理;
4、多工作表汇总计算数据透视表有限制;
5、使用数据透视表处理该问题时,要使用二次数据透视表,并且第一次使用透视表后对生成的结果进行数据处理后然后进行二次透视表运算,比较麻烦;
6、使用SQL后如果数据源有修改、增加、减少等操作时,结果可以进行刷新。




