我是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>值。
什么是正确的查询,以及如何调用此类操作(每个属性不是分组,它是其他的东西......)?
答案 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计算。或者将其用作报告的来源。报告将允许显示原始详细数据以及汇总计算。