是否可以更有效地设计以下查询?我有一个清单表列出了购买和销售的产品。我的目标是计算库存中产品的净剩余数量。
选择StokKodu,GirenMiktar,Sum(GirenMiktar)-Sum(IF(IrsaliyeliCikanMiktar IS NULL,0,IrsaliyeliCikanMiktar))作为GorunurKalan,Sum(GirenMiktar) - (Sum(IF(IrsaliyeliCikanMiktar IS NULL,0,IrsaliyeliCikanMiktar))+ Sum (IF(IrsaliyesizCikanMiktar IS NULL,0,IrsaliyesizCikanMiktar)))作为GercekKalan从库存中StokKodu IN(从库存中选择StokKodu GirenMiktar> 0)由StokKodu组成
当我购买新产品时。它使用新的StokKodu(股票代码)进入表格,其数量为GirenMiktar。每当我开始销售时,有两种程序会从GirenMiktar中减去。使用发票(IrsaliyeliCikanMiktar)进行销售,使用WayBill(IrsaliyesizCikanMiktar)进行销售。
例如:
标识StokKodu GirenMiktar IrsaliyeliCikanMiktar IrsaliyesizCikanMiktar
1个SKU1 100
2 SKU1 20
3 SKU1 10
4 SKU2 300
5 SKU2 50
6 SKU2 30
结果必须是:
StokKodu GirenMiktar GorunurKalan GercekKalan
SKU1 100 80(100-20)70(100-20-10)
SKU2 300 250(300-50)220(300-50-30)
当然,在GirenMiktaris大于零的行中返回的结果集中还会有一些描述列,例如ProductName,Date等。
StokKodu意味着标识描述产品
GirenMiktar表示购买的产品数量
IrsaliyeliCikanMiktar表示已经开具发票的已售产品数量
IrsaliyesizCikanMiktar表示尚未开具发票的已售产品数量。
非常感谢你的帮助。
答案 0 :(得分:0)
您的WHERE
/ IN
部分不是必需的。试试这个:
select
StokKodu,
GirenMiktar,
Sum(coalesce(GirenMiktar,0))
-Sum(coalesce(IrsaliyeliCikanMiktar, 0)) As GorunurKalan,
Sum(coalesce(GirenMiktar,0))
- Sum(coalesce(IrsaliyeliCikanMiktar, 0))
+ Sum(coalesce(IrsaliyesizCikanMiktar, 0)) As GercekKalan,
Birim,
Fiyat,
TedarikciId
from
inventory
group by
StokKodu
order by Tarih Desc;
答案 1 :(得分:0)
感谢Benni的指导。开发他的查询提供了一点点解决了我的问题。我上面的第一个查询大约需要2.1秒。但是下面的查询大约需要0.0147秒。差异很大。
select
*
from (
select
Tarih, StokKodu, FaturaNo, UrunAdi, GirenMiktar,
Sum(coalesce(GirenMiktar,0))
- Sum(coalesce(IrsaliyeliCikanMiktar, 0))
As GorunurKalan,
Sum(coalesce(GirenMiktar,0))
- Sum(coalesce(IrsaliyeliCikanMiktar, 0))
+ Sum(coalesce(IrsaliyesizCikanMiktar, 0))
As GercekKalan,
Birim, Fiyat, TedarikciId
from
inventory
group by
StokKodu
order by
Tarih Desc
) sonuc
where
GirenMiktar > 0