SQL:查询以显示每个属性有多少用户(已分组)

时间:2017-04-28 17:43:27

标签: sql jsp ms-access jdbc group-by

我是SQL的新手,似乎无法提出正确的问题,因为每次我以不同的方式表达它时我都得到相同的结果:一个查询按几个属性(超过共享的用户)对数据进行分组一个财产)。

我正在Glassfish服务器上编写一个基于JSP的网站,并从MS Access管理数据库。

我感兴趣的是基本上按几个不同的属性进行分组。假设我有一个表格,显示用户拥有的项目。像这样:

id  |  name |  item1  | item2  | item3  | item4  |
--------------------------------------------------
1   | name1 |   yes   |  yes   |        | yes    |
----+-------+---------+--------+--------+--------+
2   | name2 |   yes   |        |        | yes    |
----+-------+---------+--------+--------+--------+
3   | name3 |         |  yes   |        | yes    |
----+-------+---------+--------+--------+--------+
4   | name4 |   yes   |  yes   |        | yes    |
----+-------+---------+--------+--------+--------+
5   | name5 |         |        |  yes   | yes    | 
.
.
.

我需要的查询将返回以下内容:

ItemID  |  Number of users with this item
-----------------------------------------
item1   |  3
item2   |  3
item3   |  1
item4   |  5

我不知道GROUP BY如何在这里使用,因为我正在寻找的结果基本上要求原始表的属性现在将显示为<结果表的每一行中的strong>值。

什么是正确的查询,以及如何调用此类操作(每个属性不是分组,它是其他的东西......)?

2 个答案:

答案 0 :(得分:0)

如果您需要在任何表上工作,我无法看到如何在Access中执行此操作,但如果您知道表结构,则可以设计如下查询:

select 'item1' as ItemID, count(*) as [Number of users with this item]
from myTable
where item1 = 'Yes'
union
select 'item2', count(*)
from myTable
where item2 = 'Yes'
union
....

等等。

答案 1 :(得分:0)

您可以执行一个聚合查询,该查询返回包含每个Item字段下的计数的1条记录。假设这些是是/否类型字段:

SELECT Sum(IIf([Item1],1,0)) AS Count1, Sum(IIf([Item2],1,0)) AS Count2, Sum(IIf([Item3],1,0)) AS Count3, Sum(IIf([Item4],1,0)) AS Count4 FROM Table1;

您的数据结构未规范化。而不是4个项目字段应该是带有项目代码的一个项目字段。规范化结构将允许GROUP BY或CROSSTAB查询选项。

id  |  name |  item   |
----------------------+
1   | name1 |   1     |
----+-------+---------+
2   | name1 |   2     |
----+-------+---------+
3   | name1 |   4     |
----+-------+---------+
4   | name2 |   1     |
----+-------+---------+
5   | name2 |   4     |

可以使用UNION查询模拟规范化结构。 UNION没有设计器,必须键入查询构建器的SQLView。

SELECT ID AS SourceRecID, [Name] AS User, 1 AS Item, "Item1" AS Source FROM tablename
UNION SELECT ID, [Name], 2, "Item2" FROM tablename
...;

现在在另一个查询中使用该查询来执行聚合GROUP BY计算。或者将其用作报告的来源。报告将允许显示原始详细数据以及汇总计算。