使用分组依据创建表

时间:2019-01-15 19:50:00

标签: sql ms-access

我正在使用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来增加行数或记录数,但不会增加状态我想要的是。我在这里做什么错了?

3 个答案:

答案 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。但是,如果您对此演示文稿比较灵活,则它的实现要简单得多。