我正在使用Microsoft Access2016。
我有一张这样的桌子:
Column_1 Status
a Fail
b Pass
a Not tested
c Fail
c Pass
我想创建一个查询,以获取我的帮助
Column_1 Fail Not tested Pass
a 1 1 0
b 0 0 1
c 1 0 1
我希望能够计算出每种独特的Status
类型出现Column_1
的次数。在我看来,这似乎是GROUP BY
的情况,但是我很难获得每个状态的正确计数。
这是一种尝试:
SELECT [c1],
COUNT(IIF (Status='Pass', 1, 0) ) As Pass,
COUNT(IIF (Status='Fail', 1, 0) ) As Fail,
COUNT(IIF (Status='Not tested', 1, 0) ) As [Not tested]
FROM table_1
GROUP BY [c1]
但是,这在所有3列中都给了我相同的计数。而且计数也不正确。我曾考虑过在我的Status
子句中加入GROUP BY
,但这只会通过对每个状态重复a
和/或b
来增加行数或记录数,但不会增加状态我想要的是。我在这里做什么错了?
答案 0 :(得分:2)
由于您正在使用Access,因此您应该能够创建CrossTab查询以提供所需的结果:
TRANSFORM Count(tblTest.Status) AS CountOfStatus
SELECT tblTest.Column_1
FROM tblTest
GROUP BY tblTest.Column_1
PIVOT tblTest.Status;
或者,您可以执行手动交叉制表,或者将聚合函数从计数更改为总和,或者将iif函数的最后一个参数更改为null,或者同时使用这两种方法:
SELECT tblTest.Column_1,
Sum(IIf([Status]='Fail',1,0)) AS Fail,
Count(IIf([Status]='Not Tested',1,Null)) AS [Not tested],
Sum(IIf([Status]='Pass',1,Null)) AS Pass
FROM tblTest
GROUP BY tblTest.Column_1;
答案 1 :(得分:0)
我将执行两个查询-首先是使用合计函数对所需的每一列进行分组和计数的查询。
SELECT tblTest.Column_1, tblTest.Status, Count(tblTest.Status) AS CountOfStatus
FROM tblTest
GROUP BY tblTest.Column_1, tblTest.Status;
然后是一个查询,该查询将读取第一个查询,并根据需要格式化数据。
答案 2 :(得分:0)
因此,在确定交叉表的路径之前--考虑您在原始帖子中显示的1和0在数据库中不存在。您首选的布局确实是Cross Tab,但是它不是数据库使用的标准化数据结构-这就是为什么您可能要重新考虑您的方法的原因。
如果您使用汇总查询,则可以分组和计数;同时保持标准化的数据结构。作为开发人员进行管理要容易得多。在这种情况下,您将拥有: ID状态计数 失败1 a未测试1 b通行证1 c失败1 c通过1 [很抱歉没有像在消息框中那样保持柱状显示]
您可以进行一些有关“聚合查询”的在线辅导。不存在的记录将不计为0。但是,如果您对此演示文稿比较灵活,则它的实现要简单得多。