mysql complex连接三个表中的总计

时间:2013-09-30 13:42:01

标签: mysql sql function select join

我有三张桌子: 支付 命令 产品

付款表与订单之间有一对一的manay连接,就像这样突破

付款:id,name,address,payamentType,orderNumber,promoCode(promocodes在发送到订单表之前覆盖价格)

订单:id,productSku,orderNumber,orderQuatity

产品:id,sku,title,description,price,inventoryQuantity

所以我需要的是这样的(报告):

name,address,orderNumber,product1,product1Price,product1OrderQuantity,product2,product2Price,product2OrderQantity,totalProductCost,PromoCode等。

所以会有一些总和。

产品可能有所不同,但我只提取适用于报告日期范围的数据,因此n-Tier关于产品,价格,数量,(aggrigatefinalTotal)

这可以在复杂的查询中处理吗?

这叫什么类型的查询或函数?

我应该做一个函数,如果是,那么基本函数会是什么样的。

结果应如下所示: enter image description here

我还应该提到word_q_o是sku,按此顺序附加数量

和_p_o是这个订单的价格(我错过了最后一个,因为我很匆忙,但我认为你得到了要点。

2 个答案:

答案 0 :(得分:1)

主要是直接查询以获取详细信息,然后您的报告可以根据需要汇总总计。获取与付款相关的原始数据可能类似于

select
      p.id,
      p.name,
      p.address,
      p.orderNumber,
      p.promoCode,
      o.id as OrderID,
      o.orderQuantity,
      prod.sku,
      prod.title,
      prod.description,
      prod.price
   from
      payments p
         join order o
            on p.orderNumber = o.orderNumber
            join products prod
               on o.productSku = prod.sku

根据评论,在多列上尝试模拟数据透视表 - 固定字段(使用原始查询的别名为“PQ”(预查询),但特别按订单ID排序,因此行项目也在一起。

select
      PQ.ID,
      PQ.Name,
      PQ.address,
      PQ.orderNumber,
      PQ.promoCode,
      max( if( PQ.sku = 'umbrella1212', PQ.Price, 0.00 )) as Umbrella1212Price,
      sum( if( PQ.sku = 'umbrella1212', PQ.OrderQuantity, 0.00 )) as Umbrella1212Qty,
      max( if( PQ.sku = 'umbrella1010', PQ.Price, 0.00 )) as Umbrella1010Price,
      sum( if( PQ.sku = 'umbrella1010', PQ.OrderQuantity, 0.00 )) as umbrella1010Qty,
      max( if( PQ.sku = 'rainbootlg', PQ.Price, 0.00 )) as rainbootlgPrice,
      sum( if( PQ.sku = 'rainbootlg', PQ.OrderQuantity, 0.00 )) as rainbootlgQty,
      max( if( PQ.sku = 'rubFlrmts', PQ.Price, 0.00 )) as rubFlrmtsPrice,
      sum( if( PQ.sku = 'rubFlrmts', PQ.OrderQuantity, 0.00 )) as rubFlrmtsQty,
      sum( PQ.Price * PQ.OrderQuantity ) as OrderTotal
   from 
      ( select
          p.id,
          p.name,
          p.address,
          p.orderNumber,
          p.promoCode,
          o.id as OrderID,
          o.orderQuantity,
          prod.sku,
          prod.title,
          prod.description,
          prod.price
       from
          payments p
             join order o
                on p.orderNumber = o.orderNumber
                join products prod
                   on o.productSku = prod.sku
       order by
          p.id,
          o.id ) PQ
   group by
      PQ.ID,
      PQ.Name,
      PQ.address,
      PQ.orderNumber,
      PQ.promoCode

由于名称/地址/订单#/ promocode对于相同“订单号”的所有关联订单项都是相同的,因此它们会在组中出现。否则MySQL可能会唠叨列不是聚合函数的一部分(sum,min,max,avg等)

答案 1 :(得分:0)

您必须使用带有订单的JOIN付款和带有产品的订单编写查询,并且每个不同的元组(名称,订单,产品)将获得一行