一个mysql查询问题

昨天写了个对于我来说很复杂的sql语句。 这里先放个图:
 
 
现在的需要的数据如图:从product表中拿到id,name两个字段,从 buy_contract_Item和sale _contract_Item中拿到 quantity,totalMoney这两个字段,再从 buy_contract和sale_contract中拿到 contract_date字段,同时以合同签定时间为查询条件将商品各类的数量和金额sum,最后返回获取结果。表与表的关联关系如图。

后来问了下同事,拿到了返回结果:
一开始就犯了个错误,虽然从 
buy_contract_Item和sale _contract_Item获取的信息比较多,但却不能以他们为主表,这是昨天半天还没有结果的主要原因。因为所有后续的这些表都是以商品为主,为商品的买进和卖出服务的。所以这里以商品为主表做查询。  
 
product Id , Name
SELECT   id , name   FROM   product  
 
buy_contract_item productId , SUM ( quantity ) , SUM ( totalMoney )
--productId product
SELECT    productId , SUM ( quantity ) , SUM ( totalMoney )  
FROM    buy_contract_item  
GROUP   BY   productId
sale_contract_item SUM ( quantity ) , SUM ( totalMoney )
SELECT   
productId , SUM ( quantity ) , SUM ( totalMoney )  
FROM    sale_contract_item  
GROUP   BY   productId
  SELECT buy_contract
SUM ( quantity ) , SUM ( totalMoney ) contract_date
SELECT   productId , SUM ( quantity ) , SUM ( totalMoney ) , contract_date  
FROM    buy_contract_item    a  
JOIN   buy_contract   b   ON   a . contract_id   =   b . id
GROUP   BY   a . product_id ;
where
SELECT   productId , SUM ( quantity )   AS   buyQuantity , SUM ( totalMoney )   AS   buyTotalMoney , b . contract_date  
FROM    buy_contract_item    a  
JOIN   buy_contract   b   ON   a . contract_id   =   b . id
WHERE   1 = 1    and   ( b . contract_date   >=   '2015-03-13'    and   b . contract_date   <=   '2015-03-15' )
GROUP   BY   a . product_id ;
sale
SELECT   productId , SUM ( quantity )   AS   saleQuantity , SUM ( totalMoney )   AS   saleTotalMoney , d . contract_date  
FROM    buy_contract_item    c  
JOIN   buy_contract   d   ON   c . contract_id   =   d . id
WHERE   1 = 1    and   ( d . contract_date   >=   '2015-03-13'    and   d . contract_date   <=   '2015-03-15' )
GROUP   BY   c . product_id ;
SELECT    t . id , t . name ,
          IFNULL ( buyQuantity , 0 )   AS   buyQuantity ,
          IFNULL ( buyTotalMoney , 0 )   AS   buyTotalMoney ,
          IFNULL ( saleQuantity , 0 )   AS   saleQuantity ,
          IFNULL ( saleTotalMoney , 0 )   AS   saleTotalMoney  
FROM   product   t
LEFT   JOIN  
     (
          SELECT   productId , SUM ( quantity )   AS   buyQuantity , SUM ( totalMoney )   AS   buyTotalMoney , b . contract_date  
          FROM    buy_contract_item    a  
          JOIN   buy_contract   b   ON   a . contract_id   =   b . id
          WHERE   1 = 1    and   ( b . contract_date   >=   '2015-03-13'    and   b . contract_date   <=   '2015-03-15' )
          GROUP   BY   a . product_id ;
     )   m   ON   t . id   =   m . productId
LEFT   JOIN
     (
          SELECT   productId , SUM ( quantity )   AS   saleQuantity , SUM ( totalMoney )   AS   saleTotalMoney , d . contract_date  
          FROM    buy_contract_item    c  
          JOIN   buy_contract   d   ON   c . contract_id   =   d . id
          WHERE   1 = 1    and   ( d . contract_date   >=   '2015-03-13'    and   d . contract_date   <=   '2015-03-15' )
          GROUP   BY   c . product_id ;
     )   n   ON   t . id   =   n . productId
ORDER   BY   buyQuantity   DESC saleQuantity   DESC
 
    写的中间可能还有错误,但大致思路是这样,复杂的sql语句,可以先写整体框架,然后在框架里不断的细化查询。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值