sql top 1基于组记录

时间:2017-03-03 10:38:43

标签: sql sql-server

ProductMst(组合是唯一的 - CodeNum,MainCatid,SubCatid)

id  CodeNum     MainCatid   SubCatid    Desc        Qty
1   001         1           1           prod1       5
2   001         1           2           prod2       10
3   001         2           3           prod3       1
4   002         2           3           prod4       2
5   003         2           3           prod5       3
6   004         1           1           prod6       4

子表SubCatMst

id  name    subcode
1   scat1   00
2   scat2   00
3   scat3   02
4   scat4   03

期望的结果

id  CodeNum     MainCatid   SubCatid    Desc        Qty     subcode
2   001         1           2           prod2       15      00
3   001         2           3           prod3       1       02
4   002         2           3           prod4       2       02
5   003         2           3           prod5       3       02
6   004         1           1           prod6       4       00

基本上,我想根据subcodesum (Qty)进行分组,subcode进行分组。并且,根据TOP 1MAX(Qty)记录数据作为所有列。

摘要:请先检查两个结合的记录。

查询尝试:

select * from (
select A.*, B.subcode, 
ROW_NUMBER() OVER( PARTITION BY A.CodeNum, A.MainCatid, B.subcode ORDER BY A.Qty desc) as row 
from ProductMst A 
inner join SubCatMst B on A.SubCatid=B.id
) as A where row<=1

1 个答案:

答案 0 :(得分:3)

你的问题是:

  

我想将子代码分组,如果相同

如果有什么相同的话?我认为这意味着codenum是相同的。

无论确切的字段如何,逻辑都是相同的。您可以使用窗口函数来聚合数据并确定要选择的行:

select ps.*
from (select p.*, sc.subcode,
             sum(qty) over (partition by codenum, subcode) as qty,
             row_number() over (partition by codenum, subcode order by qty desc) as seqnum
      from ProductMst p join
           SubCatMst sc
           on p.subcatid = sc.id
     ) ps
where seqnum = 1;