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