优化Sql查询以获得更好的性能

时间:2014-11-11 18:20:50

标签: mysql optimization inventory

是否可以更有效地设计以下查询?我有一个清单表列出了购买和销售的产品。我的目标是计算库存中产品的净剩余数量。

选择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表示尚未开具发票的已售产品数量。

非常感谢你的帮助。

2 个答案:

答案 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