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;
我正在使用以下查询来大致了解我的结果。此时查询显示 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;