2016-01-19 22 views
0

我有一个MS Access查询(用SQL创建),用于统计设备状态表中日期列中非空值的出现次数。该表包含特定制造工厂的所有设备。查询也计算总设备,我们没有NULL值。总共有12个不同的工厂,每个工厂都有自己相同的访问表。我需要创建一个统一的SQL查询,将每个计数的总和转换为所有工厂的主计数。跨多组访问表的SQL计数求和查询

状态表的结构,命名为“_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组表格。

这里是一个工作表查询:在dept1_equipment表

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; 

的加入是用来获取所有设备的完整计数每个部门。

非常感谢。

鲍勃

+0

上的类似SQL的挑战上周得到了很大的帮助形式@sagi。如果他的解决方案有助于浏览该解决方案,请参阅[链接] http://stackoverflow.com/questions/34836370/aggregate-sql-query-across-multiple-tables了解该解决方案的详细信息。 – bcrimmins

回答

1

考虑聚合查询运行的所有12组的联合查询,然后使用保存的联合查询执行另一个最后汇总查询:

UNION

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... 

FINAL

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接入取决于复杂性允许在一个查询中包含了所有:

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 
+0

谢谢@pfafait。这是有道理的。 UNION查询本身很好,即全部12个部门。但是,当我试图将所有内容合并到一个查询中时,SUM查询产生了一个错误......我更喜欢这种查询。原来每个UNION子句末尾的分号都是问题。所以我删除了它们,效果很好。感谢您提供了一个绝佳的解 – bcrimmins

+0

太棒了!请接受以确认解决方案(您通过这样做获得积分)。事实上,不要在派生表子查询中使用分号。另外,正如我在其他问题中所评论的,尽量不要使用相同的表格。您可能认为您的部门划分较多,但关系模型中的对象较少是最佳的。你不需要联合查询。 – Parfait

+0

我同意最小化对象的一般理论,但是这个项目有商业上的考虑因素,这是推动这个规则的一个例外。简而言之,每个“部门”并不是一个真正的部门,而是一个独立的业务部门,极有可能从母公司剥离出来,并将数据带入其中,这时它将成为一个最小化的模式。所以......我如何“接受确认”? – bcrimmins