【问题标题】:multi-calculation query多计算查询
【发布时间】:2011-06-26 20:32:39
【问题描述】:

产品表

id      name       description       price

 1      AAA         AAAAAA           10.00
 2      BBB         BBBBBB           12.00
 3      CCC         CCCCCC           15.00
 4      DDD         DDDDDD            8.00
 5      EEE         EEEEEE           12.50

销售表

trackid     productid     affiliateid     paymentstatus     refundid

   1           2               1           COMPLETED         1
   2           2               0           DONE              null
   3           3               1           COMPLETED         null
   4           3               0           COMPLETED         null
   5           3               0           COMPLETED         null
   6           5               5           DONE              null
   7           5               0           COMPLETED         2
   8           5               2           COMPLETED         null
   9           2               0           DONE              null
  10           3               1           COMPLETED         3

对于销售表

  • 如果特定销售没有关联公司,则affiliateid 将为 0,否则为affiliateid(我有另一个用户表,其中列出了供应商和关联公司)

  • 如果特定销售被退款(出于任何原因),则refundid 将设置为某个值,否则将为空

  • paymentstatus 可以有 2 个值中的任何 1 个,COMPLETED 和 DONE

现在我需要查询列出产品表中每个产品的以下数据

 productid       name       totalsales      affsales        refunds

     1           AAA           0               0               0
     2           BBB           1               1               1
     3           CCC           4               2               1
     4           DDD           0               0               0 
     5           EEE           2               1               1

totalsales:付款状态为“已完成”的销售额

affsales:付款状态为“已完成”且affiliateid 不等于 0 的销售

refunds:paymentstatus 为“COMPLETED”且refundid 不为空的销售

我怎样才能形成这个特定的查询?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:
    select 
          p.name,
          SalesSummary.productid,
          COALESCE( SalesSummary.TotalSales, 0 ) TotalSales 
          COALESCE( SalesSummary.AffSales, 0 ) AffSales 
          COALESCE( SalesSummary.Refunds, 0 ) Refunds 
       from
          product p
             left join
                ( select s.productid,
                        count(*) TotalSales 
                        sum( if( s.affiliateID > 0, 1, 0 )) affSales,
                        sum( if( ifnull( s.RefundID, 0 ) > 0, 1, 0 )) Refunds
                     from 
                        sales s
                     where
                        s.PaymentStatus = 'COMPLETED'
                     group by
                        s.productid
                ) SalesSummary
             on p.id = SalesSummary.productid
    

    【讨论】:

      猜你喜欢
      • 2015-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多