2016-11-17 65 views
1

如果已经在其他线程中讨论过,请提前道歉。我确实执行了几次搜索,但无法找到一个能够帮助我满足我需求的人。 我有一个名为t_Item_log的表。我需要编写一个查询来逐项提取数据,对项目的总量进行总计,然后选择与该项目关联的数量最大的代码。通过最大数量选择值的SQL Group by声明

表举例:

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 

如果任何人都可以点我已经涵盖这或提供如何写这个语句基础线程它将不胜感激。

回答

0

这是一个复杂的查询,因为你必须聚集,以获得最常用的代码。下面是一个使用相关子查询的方法:

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; 

注意order by子句中使用max(e2.id)的。在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; 
+0

嘿家伙我不断收到以下错误消息:“您已经写了一个子查询,可以返回多个字段,而不使用主查询的FROM子句中的EXISTS保留字修改子查询的select语句以仅请求一个字段” – HareM83

+0

@ HareM83。 。 。这是一个非常奇怪的错误,事件是子查询使用'TOP'并且具有稳定的'ORDER BY'排序。我不知道如何解决这个问题。 –

+0

谢谢。这工作完美。 – HareM83

0

使用相关查询:

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 
+0

'LIMIT'应该为MySql工作,它也适用于ms访问? –

+0

感谢您的快速回复。我会试试这个。 – HareM83

+0

@ZoharPeled哎呀,谢谢。 – sagi