【问题标题】:Grouping and ordering by value, alphabet and frequency based on common value基于共同值按值、字母和频率分组和排序
【发布时间】:2020-06-08 06:33:06
【问题描述】:

所以我正在与 MS Access 合作,并让这个参与者列表包含三列年龄、名称和年龄组,并希望它首先按名称排序,然后按年龄排序,还按基于相同名称的年龄组的频率排序。例如:

age | age_group |name  
----------------------
1      0-1        Jeff
10     10=<       Dave
10     10=<       Dave
5      5-7        Carl
2      2-4        Sam
3      2-4        Carl
4      2-4        Sam
2      2-4        Sam
5      5-7        Carl
6      5-7        Jeff
7      5-7        Dave
10     10=<       Jeff
8      8-9        Jeff

所以它首先看起来像这样,按名称和年龄排序

----------------------
10     10=<       Jeff
8      8-9        Jeff
6      5-7        Jeff
1      0-1        Jeff
10     10=<       Dave
10     10=<       Dave
7      5-7        Dave
5      5-7        Carl
5      5-7        Carl
3      2-4        Carl
4      2-4        Sam
2      2-4        Sam
2      2-4        Sam

最后按age_group 频率降序排列 10=

age | age_group |name  
----------------------
10     10=<       Dave
10     10=<       Dave
7      5-7        Dave
10     10=<       Jeff
8      8-9        Jeff
6      5-7        Jeff
1      0-1        Jeff
5      5-7        Carl
5      5-7        Carl
3      2-4        Carl
4      2-4        Sam
2      2-4        Sam
2      2-4        Sam

这可以在 SQL 或 VBA 中执行吗?我得到了第一个与之合作的人:

SELECT participants.name, participants.age_group, participants.age, *
FROM participants
ORDER BY participants.name, participants.age DESC;

但是我在执行第二步时完全迷失了...... 如果您能帮助我,将不胜感激。

【问题讨论】:

  • 我只是对您所说的“年龄组频率”感到困惑。以及为什么 Carl 的行不相邻,但所有其他名称都相邻。
  • @blazingfirefly ...你检查过我的答案了吗?如果没问题,请将其标记为正确。如果不让我知道,我会尽力帮助你。

标签: sql excel vba ms-access group-by


【解决方案1】:

试试这个:

select p1.name, p2.age_group, p2.age
from participants as p1
left join (select name, age_group, count(1) as freq from participants group by name, age_group) as p2
on p1.name= p2.name and p1.age_group = p2.age_group
order by name,age, p2.freq desc

访问:

select p1.name, p1.age_group, p1.age
from participants as p1
left join 

(select name, age_group, count(1) as freq 
from participants group by name, age_group) as p2

on p1.name= p2.name and p1.age_group = p2.age_group
order by p1.name, p1.age, p2.freq desc

访问输出:

【讨论】:

  • 我尝试为 Access 修改它,但输出的排序不符合预期。
  • :^/ 排序必须是Name, Age asc and p2.freq desc ..注意例子与要求不符。
  • 感知与否 - 对我来说它看起来不像请求的输出 - 请参阅随附的屏幕截图。
  • 所附截图是正确的,因为它被要求。这个问题有点棘手;)
  • Buffff .... 一场灾难:P 无论如何,这两个答案都解决了“堵塞”xD 问题定义错误。
【解决方案2】:

这个花哨的 SQL 将提供分组输出:

SELECT 
    T3.age, T3.age_group, T3.name
FROM 
    Participants As T3
INNER JOIN

    (SELECT [age] * 1000 + Count(*) AS rating, T.name
    FROM participants AS T 
    INNER JOIN 

        (SELECT Max(participants.age) AS maxage, participants.name
        FROM participants
        GROUP BY participants.name) AS T2 

    ON (T.age = T2.maxage) AND (T.name = T2.name)
    GROUP BY T.name, T.age
    ORDER BY [age] * 1000 + Count(*) DESC) AS T4

ON T3.name = T4.name
ORDER BY T4.rating Desc, T3.age Desc

输出:

【讨论】:

  • 很遗憾不起作用。我将示例和问题调整得更准确。
  • 完成...但我认为我的问题更准确。
  • @Ibai:谢谢。但是,我确实尝试了您的版本,但它在 Access 中无法为我运行。
  • 我已经在 SQLServer 中尝试过,它可以工作。无论如何,你的很好。
  • 我第一次收到访问错误“无法加入备忘录、OLE 或超链接对象”。那是我注意到字段:年龄被设置为长文本的时候。将其更改为数字,现在它就像一个魅力!非常感谢您的所有贡献。 =) 我将答案标记为最终答案。如果我的问题表述得有些含糊,我深表歉意。
猜你喜欢
  • 2020-10-12
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多