SQL 使用 group by 相互计算多行

SQL counting multi lines with each other using group by

我正在使用以下查询来大致了解我的结果。此时查询显示 4 行而不是 2 行。我想将前 3 列作为查询的键。建议这样做吗?

select 
    r.ID, m.MATERIALID, m.LOT, ms.AMMOUNT as aantal, 
    m.NETPRICE as prijs, 
    (ms.AMMOUNT * m.NETPRICE) as Total 
from 
    rc_recall r 
inner join 
    RC_RECALLMATSTORE ms on r.ID = ms.RECALLID 
inner join 
    RC_RECALLMATERIAL m ON ms.RECALLID = m.RECALLID and ms.LINE = m.LINE 
where 
    r.ID = '2015073' and d.LANG = 'FR'
group by 
    r.ID, m.MATERIALID m.LOT, ms.AMMOUNT, m.NETPRICE;

我得到的结果:

2015073 | 100654643 | 1 | 2 | 0.9200    | 1.8400000
2015073 | 100654643 | 1 | 5 | 0.9200    | 4.6000000
2015073 | 100654643 | 2 | 3 | 0.9200    | 2.7600000
2015073 | 100654643 | 2 | 5 | 0.9200    | 4.6000000

是否可以计算相同的行数:'r.ID, m.MATERIALID, m.LOT'?

我想要的结果:

2015073 | 100654643 | 1 | 7 | 0.9200    | 6.4400000
2015073 | 100654643 | 2 | 8 | 0.9200    | 7.3600000

您可能想使用 sum() 和其他聚合函数:

select r.ID, m.MATERIALID, m.LOT, sum(ms.AMMOUNT) as aantal,
       sum(m.NETPRICE )as prijs, sum(ms.AMMOUNT * m.NETPRICE) as Total
from rc_recall r inner join
     RC_RECALLMATSTORE ms
     on r.ID = ms.RECALLID inner join
     RC_RECALLMATERIAL m
     ON ms.RECALLID = m.RECALLID and ms.LINE = m.LINE 
where r.ID = '2015073' and d.LANG = 'FR'
group by r.ID, m.MATERIALID, m.LOT;

您还需要修复 group by 以达到正确的粒度。

如果您不想按 AMMOUNT 和 NETPRICE 分组,则必须以其他方式汇总它们,例如 MIN 或 SUM。这将 return 您上面描述的输出,但您需要确认它是否真的正确;

select r.ID, m.MATERIALID, m.LOT, ms.AMMOUNT as aantal, min(m.NETPRICE) as prijs, sum(ms.AMMOUNT * m.NETPRICE) as Total 
from rc_recall r 
inner join RC_RECALLMATSTORE ms on r.ID = ms.RECALLID 
inner join RC_RECALLMATERIAL m ON ms.RECALLID = m.RECALLID and ms.LINE = m.LINE 
where r.ID = '2015073' and d.LANG = 'FR'
group by r.ID, m.MATERIALID m.LOT;

从 GROUP BY 中删除 "ms.AMMOUNT" 并添加一些 SUM() 函数应该可以完成工作:

select r.ID, m.MATERIALID, m.LOT
        , SUM(ms.AMMOUNT) as aantal
        , m.NETPRICE as prijs
        , SUM(ms.AMMOUNT * m.NETPRICE) as Total
from rc_recall r 
inner join RC_RECALLMATSTORE ms on r.ID = ms.RECALLID 
inner join RC_RECALLMATERIAL m ON ms.RECALLID = m.RECALLID and ms.LINE = m.LINE 
where r.ID = '2015073' and d.LANG = 'FR'
group by r.ID, m.MATERIALID, m.LOT, m.NETPRICE;