【问题标题】:SQL count summation query across multiple sets of Access tables跨多组 Access 表的 SQL 计数求和查询
【发布时间】:2016-01-19 21:05:02
【问题描述】:

我有一个 MS Access 查询(使用 SQL 创建),它计算设备状态表中日期列中非 NULL 值的出现次数。该表包含特定制造工厂的所有设备。该查询还计算设备总数,我们没有 NULL 值。共有 12 个不同的工厂,每个工厂都有自己相同的一组 Access 表。我需要创建一个整合的 SQL 查询,将每个计数的总和创建为所有植物的主计数。

status 表的结构,名为 '_review_status' 是:

equip_number, text
review_a_analysis, date
review_b_analysis, date 
review_c_analysis, date
review_d_analysis, date
review_e_analysis, date
review_f_analysis, date
review_g_analysis, date

工作查询的结果(在一张表上)如下所示。

a   b   c   d   e   f   g   equip_count
17  31  0   94  13  12  44  1249

新的结果应该和上面的完全一样,只是数字都会变大,因为查询会查看所有 12 组表。

这是有效的单表查询:

SELECT 
Count(dept1_review_status.review_a_analysis) AS a, 
Count(dept1_review_status.review_b_analysis) AS b, 
Count(dept1_review_status.review_c_analysis) AS c, 
Count(dept1_review_status.review_d_analysis) AS d, 
Count(dept1_review_status.review_e_analysis) AS e, 
Count(dept1_review_status.review_f_analysis) AS f, 
Count(dept1_review_status.review_g_analysis) AS g,
Count(dept1_equipment.dept1_equip_number) AS equip_count
FROM dept1_equipment 
LEFT JOIN dept1_review_status 
ON dept1_equipment.dept1_equip_number = 
dept1_review_status.dept1_equip_number;

dept1_equipment 表上的连接用于获取每个部门中所有设备的完整计数。

非常感谢。

鲍勃

【问题讨论】:

  • 上周在类似的 SQL 挑战中得到了来自 @sagi 的极大帮助。如果他的解决方案有助于浏览此解决方案,请参阅 [link]stackoverflow.com/questions/34836370/… 了解有关该解决方案的详细信息。

标签: sql ms-access


【解决方案1】:

考虑对所有 12 个 group by 聚合查询运行联合查询,然后使用保存的联合查询运行另一个最终聚合查询:

联合

SELECT 
   Count(dept1_review_status.review_a_analysis) AS a, 
   Count(dept1_review_status.review_b_analysis) AS b, 
   Count(dept1_review_status.review_c_analysis) AS c, 
   Count(dept1_review_status.review_d_analysis) AS d, 
   Count(dept1_review_status.review_e_analysis) AS e, 
   Count(dept1_review_status.review_f_analysis) AS f, 
   Count(dept1_review_status.review_g_analysis) AS g,
   Count(dept1_equipment.dept1_equip_number) AS equip_count
FROM dept1_equipment LEFT JOIN dept1_review_status 
ON dept1_equipment.dept1_equip_number = dept1_review_status.dept1_equip_number;

UNION ALL

SELECT 
   Count(dept2_review_status.review_a_analysis) AS a, 
   Count(dept2_review_status.review_b_analysis) AS b, 
   Count(dept2_review_status.review_c_analysis) AS c, 
   Count(dept2_review_status.review_d_analysis) AS d, 
   Count(dept2_review_status.review_e_analysis) AS e, 
   Count(dept2_review_status.review_f_analysis) AS f, 
   Count(dept2_review_status.review_g_analysis) AS g,
   Count(dept2_equipment.dept2_equip_number) AS equip_count
FROM dept2_equipment LEFT JOIN dept2_review_status 
ON dept2_equipment.dept2_equip_number = dept2_review_status.dept2_equip_number;

UNION ALL

SELECT 
   Count(dept3_review_status.review_a_analysis) AS a, 
   Count(dept3_review_status.review_b_analysis) AS b, 
   Count(dept3_review_status.review_c_analysis) AS c, 
   Count(dept3_review_status.review_d_analysis) AS d, 
   Count(dept3_review_status.review_e_analysis) AS e, 
   Count(dept3_review_status.review_f_analysis) AS f, 
   Count(dept3_review_status.review_g_analysis) AS g,
   Count(dept3_equipment.dept3_equip_number) AS equip_count
FROM dept3_equipment LEFT JOIN dept3_review_status 
ON dept3_equipment.dept3_equip_number = dept3_review_status.dept3_equip_number;

...other 9 tables...

最终

SELECT Sum(unionqry.a), 
       Sum(unionqry.b), 
       Sum(unionqry.c), 
       Sum(unionqry.d), 
       Sum(unionqry.e), 
       Sum(unionqry.f), 
       Sum(unionqry.g), 
       Sum(unionqry.h), 
       Sum(unionqry.equip_count)
FROM unionqry

或者,如果 MS Access 允许,您可以根据复杂性将所有内容合并到一个查询中:

SELECT Sum(unionqry.a), 
       Sum(unionqry.b), 
       Sum(unionqry.c), 
       Sum(unionqry.d), 
       Sum(unionqry.e), 
       Sum(unionqry.f), 
       Sum(unionqry.g), 
       Sum(unionqry.h), 
       Sum(unionqry.equip_count)
FROM (...above union query)... As unionqry

【讨论】:

  • 谢谢你,@parfait。这是有道理的。 UNION 查询本身运行良好,即所有 12 个部门。但是,当我尝试将所有内容合并到一个查询中时,SUM 查询会产生错误……我更喜欢。事实证明,每个 UNION 子句末尾的分号是问题所在。所以我删除了它们,效果很好。感谢您提供出色的解决方案!
  • 太棒了!请接受以确认解决方案(您通过这样做获得了积分)。实际上,不要在派生表子查询中使用分号。另外,正如我在其他问题中评论的那样,尽量不要使用相同的表格。您可能认为通过划分部门使您更有条理,但关系模型中较少的对象是最佳的。这样做不需要联合查询。
  • 我同意最小化对象的一般理论,但是这个项目的商业考虑导致了这里规则的例外。简而言之,每个“部门”并不是一个真正的部门,而是一个独立的业务单元,很可能从母公司分拆出来,带着它的数据……那时它将成为一个最小化的模式。那么...我如何“接受确认”?
  • 好的,是的,实际的业务需求会干扰最佳的开发设计。另外,问题左侧有一个相当大的grayed out check mark 供接受。
猜你喜欢
  • 2013-11-29
  • 2015-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-04
  • 1970-01-01
相关资源
最近更新 更多