Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用Group By创建表_Sql_Ms Access - Fatal编程技术网

Sql 使用Group By创建表

Sql 使用Group By创建表,sql,ms-access,Sql,Ms Access,我正在使用Microsoft Access 2016 我有一张这样的桌子: 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

我正在使用Microsoft Access 2016

我有一张这样的桌子:

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    
我希望能够计算每个唯一的
列1
类型出现
状态的次数。在我看来,这似乎是一个“分组依据”
的案例,但我很难获得每个状态的正确计数

这里有一个尝试:

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列中相同的计数。而且计数也不正确。我曾考虑在我的
GROUP BY
子句中包含
Status
,但这只会增加结果中的行数或记录数,因为每个状态重复
a
和/或
b
,这不是我想要的。我在这里做错了什么?

我会做两个查询-第一个查询使用totals函数对您想要的每一列进行分组和计数

SELECT tblTest.Column_1, tblTest.Status, Count(tblTest.Status) AS CountOfStatus
FROM tblTest
GROUP BY tblTest.Column_1, tblTest.Status;

然后是一个查询,它读取第一个查询并按照您的意愿格式化数据。

我将执行两个查询-第一个查询使用totals函数对您想要的每一列进行分组和计数

SELECT tblTest.Column_1, tblTest.Status, Count(tblTest.Status) AS CountOfStatus
FROM tblTest
GROUP BY tblTest.Column_1, tblTest.Status;

然后是一个查询,它读取第一个查询并按照您的意愿格式化数据。

由于您使用Access,您应该能够创建一个交叉表查询,以获得所需的结果:

TRANSFORM Count(tblTest.Status) AS CountOfStatus
SELECT tblTest.Column_1
FROM tblTest
GROUP BY tblTest.Column_1
PIVOT tblTest.Status;
或者,您可以执行手动交叉制表,将聚合函数从count更改为sum,或将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;

由于使用Access,您应该能够创建一个交叉表查询,以提供所需的结果:

TRANSFORM Count(tblTest.Status) AS CountOfStatus
SELECT tblTest.Column_1
FROM tblTest
GROUP BY tblTest.Column_1
PIVOT tblTest.Status;
或者,您可以执行手动交叉制表,将聚合函数从count更改为sum,或将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;

<>所以在你使用十字标签的路径之前——考虑你在原始帖子中显示的1s和0不存在于数据库中。您首选的布局确实是交叉表,但它不是数据库使用的标准化数据结构——这就是为什么您可能需要重新考虑您的方法

如果使用聚合查询,则可以进行分组和计数;同时维护规范化的数据结构。作为一名开发人员,它更容易管理。在这种情况下,您可能会: 身份证状态计数 a失败1 a未经测试1 b通过1 c失败1 c通过1 [很抱歉,没有将柱状显示保留在消息框中]


您可以做一些关于聚合查询的在线教程。对于不存在的记录,它不会计数为0。但是,如果你在这个演示中灵活,那么实现就更简单了。

< P>所以在你下一个十字标签的路径之前——考虑你在原始帖子中显示的1s和0不存在于数据库中。您首选的布局确实是交叉表,但它不是数据库使用的标准化数据结构——这就是为什么您可能需要重新考虑您的方法

如果使用聚合查询,则可以进行分组和计数;同时维护规范化的数据结构。作为一名开发人员,它更容易管理。在这种情况下,您可能会: 身份证状态计数 a失败1 a未经测试1 b通过1 c失败1 c通过1 [很抱歉,没有将柱状显示保留在消息框中]


您可以做一些关于聚合查询的在线教程。对于不存在的记录,它不会计数为0。但是,如果您对此演示灵活,它将是一个更简单的实现。

计数1或计数0将每次返回1。你可以用sum来代替。@andrewwelp,就是这样。谢谢你打开我的眼睛。每次数到1或0都会返回1。你可以用sum来代替。@andrewwelp,就是这样。谢谢你打开我的眼睛。嗯,我已经能够得到我想要的东西,使用安德鲁的建议,在评论中简单地用
SUM
替换我所拥有的东西,但这并没有给我想要的输出。嗯,我已经能够使用Andrew在评论中的建议得到我想要的东西,简单地用
SUM
替换我拥有的东西,但这并没有给我想要的输出。这或多或少给了我想要的东西,是一个比我的硬编码更优雅的解决方案,但我还有一个引起问题的“”列。这是因为我的表吗?如果您的状态列中有一条记录为“”,那么您将得到一个交叉选项卡,其中包含一个具有该名称的列,除非您将其过滤掉<代码>何处状态“”Gotcha那么那必须是
Null
或空白?因为我正在使用的测试表中有一些状态行还没有填写。你给了我很多值得思考的东西,因为我对SQL缺乏经验,以前从未使用过
PIVOT
。这或多或少给了我想要的东西,是一个比我的硬编码更优雅的解决方案,但我还有一个“”列,它导致了问题。这是因为我的表吗?如果您的状态列中有一条记录为“”,那么您将得到一个交叉选项卡,其中包含一个具有该名称的列,除非您将其过滤掉<代码>何处状态“”Gotcha那么那必须是
Null
或空白?因为我正在使用的测试表中有一些状态行还没有填写。你给了我很多值得思考的东西,因为我对SQL缺乏经验,以前从未使用过
PIVOT