一、问题描述
1、数据集
销区 | 客户 | 商品 | 销量 |
北区 | 北客户甲 | A | 10 |
北区 | 北客户乙 | A | 8 |
北区 | 北客户丙 | B | 13 |
北区 | 北客户丁 | C | 9 |
南区 | 南客户甲 | A | 8 |
南区 | 南客户乙 | B | 15 |
南区 | 南客户丙 | C | 9 |
南区 | 南客户丁 | C | 14 |
2、问题描述
在Quick BI中创建一个交叉表“销售统计1”,如下图
复制交叉表“销售统计1”,并重命名为“销售统计2”,如下图
在Quick BI中添加一个“查询控件”包括两个查询条件,一个是销区,一个是销量,并关联交叉表“销售统计1”。查询销区为“北区”,销量“>15”,结果如下图:
在Qucik BI中添加一个“复合式查询控件”两个筛选字段,一个是销区,一个是销量,关系为”且”,并关联交叉表”销售统计2”。 查询销区为“北区”,销量“>15”,结果如下图:
数据返回为空。这个查询结果显示不正确的。
为什么,同样的查询条件下,“查询控件”和“复合式查询控制”的结果会不一样呢?
二、原因分析
1、SQL代码分析
SELECT
A_T_1_.`销区` AS T_A17_2_,
A_T_1_.`商品` AS T_A56_3_,
SUM(A_T_1_.`销量`) AS T_A66_4_
FROM
`销售记录`.`销售记录` AS A_T_1_
WHERE
A_T_1_.`销区` = '北区'
GROUP BY
A_T_1_.`销区`,
A_T_1_.`商品`
HAVING
SUM(A_T_1_.`销量`) > 15
ORDER BY
T_A17_2_ ASC,
T_A56_3_ ASC
LIMIT
0, 20
SELECT
COUNT(1) AS query_count
FROM
(
SELECT
A_T_1_.`销区` AS T_A17_2_,
A_T_1_.`商品` AS T_A56_3_,
SUM(A_T_1_.`销量`) AS T_A66_4_
FROM
`销售记录`.`销售记录` AS A_T_1_
WHERE
A_T_1_.`销区` = '北区'
GROUP BY
A_T_1_.`销区`,
A_T_1_.`商品`
HAVING
SUM(A_T_1_.`销量`) > 15
) AS a
“复合式查询控件”下的SQL代码
SELECT
A_T_1_.`销区` AS T_A17_2_,
A_T_1_.`商品` AS T_A56_3_,
SUM(A_T_1_.`销量`) AS T_A66_4_
FROM
`销售记录`.`销售记录` AS A_T_1_
WHERE
A_T_1_.`销区` = '北区'
AND A_T_1_.`销量` > 15
GROUP BY
A_T_1_.`销区`,
A_T_1_.`商品`
ORDER BY
T_A17_2_ ASC,
T_A56_3_ ASC
LIMIT
0, 20
SELECT
COUNT(1) AS query_count
FROM
(
SELECT
A_T_1_.`销区` AS T_A17_2_,
A_T_1_.`商品` AS T_A56_3_,
SUM(A_T_1_.`销量`) AS T_A66_4_
FROM
`销售记录`.`销售记录` AS A_T_1_
WHERE
A_T_1_.`销区` = '北区'
AND A_T_1_.`销量` > 15
GROUP BY
A_T_1_.`销区`,
A_T_1_.`商品`
) AS a
对比上述两段SQL代码,可以发现两者的区别在于对筛选条件“销量大于15”的代码描述不一样。在“查询控件”中的代码第23~25行为“HAVING SUM(A_T_1_.`销量`) > 15”,而在“复合式查询控件”中的代码第17行却是出现有WHERE子句的中“AND A_T_1_.`销量` > 15“,显然”复合式查询控件“中的代码并没有进行sum聚合,是不正确的。
2、两种查询控件添加操作分析
如上图可见,在添加“查询控件“时,是有”聚合方式“选择的。
如上图可见,在添加“复合式查询控件”时,是没有”聚合方式”选择的,这就意味着,在这种情况下是针对数据集中的每条记录进行销量筛选的,而不是对sum聚合后的数据进行筛选。
三、小结
同样的查询条件下,“查询控件”和“复合式查询控件”的结果不一样,是由于查询控件筛选对象的不一致性导致的。同时,由于“复合式查询控件“的功能绝大多数的情况下都可以通过”查询控件“实现,因此,建议在软件更新完善前,应尽量少使用“复合式查询控件“。