2013-09-30 61 views
0

总计加入我有三个表: 支付 订单 产品MySQL的复杂跨越三个表

的支付表有一个manay连接到订单,打破了这样的

付款:ID,姓名,地址,payamentType,订单编号,促销码(促销代码,它们送入订单表之前覆盖价)

订单:ID,productSku,订单编号,orderQuatity

产品有:ID,SKU,标题,描述,价格,inventoryQuantity

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

的姓名,地址,订单编号,产品1,product1Price,product1OrderQuantity,产品2, product2Price,product2OrderQantity,totalProductCost,PromoCode等

所以会有一些总数。

产品可以改变,但我只拉适用报告tothe日期范围的数据,因此在产品,价格,quanties N层,(aggrigatefinalTotal)

这能在一个复杂的查询处理?

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

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

结果应该是这样的: enter image description here

我还要提到的word_q_o的SKU附有数量顺序

与此订单_p_o是价格(我错过了最后一个,因为我但是我认为你得到了要点

+0

您是否缺少将产品与订单关联的表格?据我所知,没有办法将产品链接到订单上?此外,您所请求的输出仅适用于与订单相关联的产品数量不超过2个的情况。如果订单中有更多产品,则每个产品需要另外3列。 – GarethD

回答

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”(Prequery)的别名,但通过订单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 

由于名称/地址/命令#/促销码将是所有相关联的项目相同的相同的“订单号”的,他们来了否则MySQL可能会唠叨关于列不是聚合函数(sum,min,max,avg等)的一部分

+0

这很接近,一切似乎连接,但我正在寻找具有orderquatity作为行值productsku。用一个视觉示例查看我修改的问题。 –

+0

@FrankTudor,你想要什么是可能的,但不适用于任何类型的报告......除非你知道可以完成的最大数量的项目。如果不是的话,那么它就必须用动态SQL来完成,在这里你可以即时创建命令。你可以枢轴转动,但我还没有看到这样一个例子,它会转动每个符合条件的行的多个字段。 – DRapp

+0

对不起,我不得不添加一个文件,我无法获得格式正确。 –

0

你必须写一个JOIN付款的查询命令和产品订单,你会得到每行不同的元组(命名,订单,产品)一行