【问题标题】:SQL Group by statement where value is selected by greatest quantitySQL Group by 语句,其中值按最大数量选择
【发布时间】:2016-11-17 11:44:23
【问题描述】:

如果这已经在另一个线程中讨论过,我提前道歉。我确实进行了几次搜索,但找不到可以帮助我满足需求的搜索。 我有一个名为 t_Item_log 的表。我需要编写一个查询来提取数据,按项目分组,对项目的总数量求和,然后选择与该项目关联的最大数量的代码。

表格示例:

ID  ITEM    CODE    QTY
1   12345    X       1
2   12345    X       2
3   12345    Y       1
4   12345    Z       3
5   6789     X       1
6   6789     X       2
7   6789     Y       1
8   6789     Z       2
9   6789     X       3
10  12345    Y       4

期望的结果

ITEM    CODE    QTY
12345   Y       11
6789    X        9

如果有人能指出一个已经涵盖此内容的线程或为如何编写此语句提供基础,将不胜感激。

【问题讨论】:

    标签: sql ms-access if-statement group-by max


    【解决方案1】:

    这是一个复杂的查询,因为您必须聚合才能获得最常见的代码。这是一个使用相关子查询的方法:

    select ei.item,
           (select top 1 e2.code
            from example as e2
            where e2.item = ei.item
            group by e2.code
            order by count(*) desc, max(e2.id)
           ) as code,
           ei.qty
    from (select e.item, sum(e.qty) as qty
          from example as e
          group by e.item
         ) as ei;
    

    注意max(e2.id)order by 子句中的使用。在 MS Access 中,TOP 实际上是 TOP WITH TIES。包含id 保证只返回一行。

    编辑:

    如果没有关联的子查询,计算会更加痛苦。像这样的:

    select e.item, e.qty, i.code
    from ((select e.item, sum(e.qty) as qty
           from example as e
           group by e.item
          ) as ei inner join
          (select e.item, max(cnt) as maxcnt
           from (select e.item, e.code, count(*) as cnt
                 from example e
                 group by e.item, e.code
                ) as ic
           group by e.item
          ) as i
         ) inner join
         (select e.item, e.code, count(*) as cnt
          from example e
          group by e.item, e.code
         ) ic
         on ic.item = i.item and ic.cnt = i.cnt;
    

    【讨论】:

    • 大家好,我不断收到以下错误消息:“您编写的子查询可以返回多个字段,而无需在主查询的 FROM 子句中使用 EXISTS 保留字。修改子查询只请求一个字段”
    • @HareM83 。 . .这是一个非常奇怪的错误,子查询使用TOP 并且具有稳定的ORDER BY 排序。我不知道如何解决这个问题。
    【解决方案2】:

    使用相关查询:

    SELECT t.item,
           (SELECT TOP 1 s.code FROM t_Item_log s
            WHERE s.item= t.item
            ORDER BY s.qty DESC) as code_of_max_qty,
           SUM(t.qty)
    FROM t_Item_log t
    GROUP BY t.item
    

    【讨论】:

    • LIMIT 应该适用于 MySql,是否也适用于 ms-access?
    • 感谢您的快速回复。我会试试这个。
    • @HareM83 尝试固定查询。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多