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:查询以显示每个属性有多少用户(分组)的主要内容,如果未能解决你的问题,请参考以下文章

SQL 检索最新记录,按唯一外键分组

尽管对所有关键变量进行了分组,SQL 还是重复?

关于分组 2 列的 SQL 选择查询

sqlserver2008,sql编程,group by 用法

sqlserver2008,sql编程,group by 用法

查找 sql 查询以获取每个分组的最新关联日期