【问题标题】:select *, group by ID.. cannot group by * --- how to merge summary statistics?select *, group by ID.. cannot group by * --- 如何合并汇总统计?
【发布时间】:2017-10-18 18:38:27
【问题描述】:

我过去经常使用 SAS。所以这对我尝试在 Access 2016 中执行此操作来说很烦人。 表格示例:

ID        Name      Sport
__________________________
99       Jack         Soccer
99       Jack Jim     Baseball
54       Bob          Basketball      

我想选择 *,计算 ID 并按 ID 分组,因此我可以添加一个显示重复 ID 的位置,因为笛卡尔匹配。

我想要的是这个:

ID        Name      Sport          ID_Count
______________________________________________
99       Jack         Soccer           2
99       Jack Jim     Baseball         2  
54       Bob          Basketball       1

但是,我收到无法按 * 分组的消息,因为由于某种原因无法合并汇总统计信息,但在其他情况下可以合并笛卡尔积。有解决办法吗?

【问题讨论】:

  • 虽然结果相似,但 SAS 和 SQL 相差甚远。最好在使用 SQL 时几乎忘记 SAS 术语和实践(例如,在 SQL 中合并是一个与 SAS 大不相同的术语)

标签: sql ms-access


【解决方案1】:

SAS 在 proc sql 中重新合并聚合结果是非标准语法。标准 SQL 支持执行此操作的窗口函数。唉,MS Access 不支持这个标准功能。

类似的方法是在聚合查询或相关子查询上使用JOIN:

select t.*,
       (select count(*) from t t2 where t2.id = t.id) as id_count
from t;

ANSI 标准功能是:

select t.*, count(*) over (partition by id) as id_count
from t;

【讨论】:

  • (select count(*) from t t2 where t2.id = t.id) as id_count....当你说 select count from "t t2" 是否意味着它从两者都计数桌子?
  • 我尝试使用 ANSI 版本,但我得到的错误是 ID 分区中缺少运算符
  • 没关系.. 我刚做了两张桌子并加入了 ID。我想我将不得不开始习惯经历更多的步骤
  • @Mitchell 。 . .相关子查询与 SAS 所做的非常接近。
  • 只是想了解您的示例中的 t 和 t2 的 count(*) 是如何的
【解决方案2】:

你可以在你的 ms access 2016 中试试这个:

Select yourtable.*, q1.ID_Count from yourtable 
join (select id, count(id) as ID_Count from yourtable group by id having count(id)>1) q1 
on yourtable.id = q1.id

【讨论】:

  • 我为你投了赞成票,但因为我是平民,所以什么也没做。
  • 它说它没有显示任何东西,因为我的声望低于 15。
【解决方案3】:

当您可以列出您的字段并仍然使用分组依据时,为什么要使用 *?

SELECT ID, Name, Sport, Count([ID]) as [ID_Count]
FROM TableName
GROUP BY ID, Name, Sport

我不会尝试在 MS Access 中通过查询在组中使用 *。可能会使简单的任务复杂化。

【讨论】:

  • 如果我按所有 3 个参数分组,ID 计数不会总是 1,因为每一行都是唯一的吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多