SQL:查询以显示每个属性有多少用户(分组)
Posted
技术标签:
【中文标题】SQL:查询以显示每个属性有多少用户(分组)【英文标题】:SQL: query to show how many users have each property (grouped) 【发布时间】:2017-04-28 17:43:26 【问题描述】:我是 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
,因为我正在寻找的结果基本上要求原始表的 属性 现在将显示为 结果表的每一行中的值。
什么是正确的查询,以及如何调用这样的操作(不是每个属性分组,它是别的......)?
【问题讨论】:
你应该改变你的数据库设计。有一张用户表(user_id, name),一张表(item_id, name)和一张user_items(user_id, item_id)。有了这种规范化的表结构查询会更容易编写。 【参考方案1】:如果您需要在任何表上工作,我看不出如何在 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
....
等等。
【讨论】:
...但我同意其他海报的观点,即更好的数据库设计会使这变得容易得多。【参考方案2】:您可以执行聚合查询,返回 1 条记录,每个项目字段下都有计数。假设这些是 Yes/No 类型字段:
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 计算。或将其用作报告的来源。报告将允许显示原始详细数据以及汇总计算。
【讨论】:
以上是关于SQL:查询以显示每个属性有多少用户(分组)的主要内容,如果未能解决你的问题,请参考以下文章
sqlserver2008,sql编程,group by 用法