0

3 つのテーブルがあります。

支払いテーブルには、このように発生する注文への1対1の接続があります

支払い: id、name、address、payamentType、orderNumber、promoCode (プロモーション コードは、注文テーブルに送信される前に価格を上書きします)

注文: id、productSku、orderNumber、orderQuatity

製品: ID、SKU、タイトル、説明、価格、在庫数量

だから私が必要としているのは、このようなものです(レポート):

名前、住所、注文番号、product1、product1Price、product1OrderQuantity、product2、product2Price、product2OrderQantity、totalProductCost、PromoCode など

したがって、いくつかの合計が表示されます。

製品はさまざまですが、レポートの日付範囲に適用されるデータのみを取得しているため、製品、価格、数量の n 層 (aggregatefinalTotal)

これは複雑なクエリで処理できますか?

これはどのタイプのクエリまたは関数と呼ばれますか?

代わりに関数を実行する必要がありますか?もしそうなら、基本的な関数はどのようになりますか?

結果は次のようになります。 ここに画像の説明を入力

また、word_q_o は、この順序で数量が追加された SKU であることにも言及する必要があります。

_p_o はこの注文の価格です (急いでいたので最後の注文を見逃してしまいましたが、要点は理解できたと思います。

4

2 に答える 2

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

名前/住所/注文番号/プロモーション コードは、関連付けられたすべての項目で同じ「注文番号」であるため、グループ化されます。そうしないと、MySQL は、列が集計関数 (sum、min、max、avg など) の一部ではないことに不満を抱く可能性があります。

于 2013-09-30T14:23:18.113 に答える
0

注文との JOIN 支払いと製品との注文を使用してクエリを作成する必要があり、異なるタプル (名前、注文、製品) ごとに 1 つの行を取得します。

于 2013-09-30T13:46:23.583 に答える