1

テーブル構造の前置きをします。

revshare r : orderNo、sales、commission、itemid、EventDate などの購入に関する情報が含まれています。

Products p: PID (製品 ID) を含む製品に関する情報が含まれており、Merchant テーブルに結合して Merchant 情報を取得するために使用されます。

Merchants m: MerchantName を含む、製品が購入された販売者に関する情報が含まれています。

質問

特定の月の手数料の合計で注文された上位 10 個の itemid をプルする MySQL クエリを作成しようとしています。取得したいデータ セット全体は 2011 年から 2013 年のものであるため、毎年 120 レコード (1 か月あたり 10 レコード) が入力されます。

1 か月分のデータを取得するクエリを作成し、UNION ALL を使用して、各クエリから 10 レコードのレコード リストを作成することを計画しました (各クエリは、月の上位 10 の itemid を表します)。

クエリ1

このクエリは、特定の月のアイテムの合計コミッションに基づいて、上位 10 個のアイテム ID を正確に返します。

SELECT 
m.MerchantName, 
Count(r.OrderNo), 
sum(r.commission)

FROM revshare r
LEFT JOIN Products p ON r.itemid = p.PID
LEFT JOIN Merchants m ON p.MID = m.MID

WHERE r.EventDate between '2011-01-01' and '2011-01-31'

GROUP by r.itemid
ORDER by 3 DESC LIMIT 10

「2011-02-01」と「2011-02-31」の間の翌月のレコードを取得できるように、このクエリを別のクエリと UNION しようとすると、「エラー: UNION と ORDER BY の使用法が正しくありません」というエラーが表示されます。これは、明らかに、UNION 化されたクエリのセットでは、最後のクエリ以外では ORDER BY を使用できないためです。データ セット全体を取得し、Excel または Pentaho BI を使用してトップ 10 のみを表示することもできますが、revshare テーブルの膨大なデータ セットに基づいて効率的ではありません。

以下は、機能しない UNION ALL を使用したクエリです。このデータを取得するためのより良い方法はありますか?

どんな助けでも大歓迎です。

よろしく、 -クリス

クエリ 2 (ORDER BY ステートメントのために機能しません)

SELECT 
m.MerchantName, 
Count(r.OrderNo), 
sum(r.commission)

FROM revshare r
LEFT JOIN Products p ON r.itemid = p.PID
LEFT JOIN Merchants m ON p.MID = m.MID

WHERE r.EventDate between '2011-01-01' and '2011-01-31'

GROUP by r.itemid
ORDER by 3 DESC LIMIT 10

UNION ALL

SELECT 
m.MerchantName, 
Count(r.OrderNo), 
sum(r.commission)

FROM revshare r
LEFT JOIN Products p ON r.itemid = p.PID
LEFT JOIN Merchants m ON p.MID = m.MID

WHERE r.EventDate between '2011-02-01' and '2011-02-31'

GROUP by r.itemid
ORDER by 3 DESC LIMIT 10
4

2 に答える 2

3

わかりました、これを試してください...

SELECT * FROM (
  SELECT 
    m.MerchantName, 
    Count(r.OrderNo), 
    sum(r.commission)
  FROM
    revshare r
    LEFT JOIN Products p ON r.itemid = p.PID
    LEFT JOIN Merchants m ON p.MID = m.MID
  WHERE
    r.EventDate between '2011-01-01' and '2011-01-31'
  GROUP by
    r.itemid
  ORDER by 
    3 DESC LIMIT 10
) AS RESULT1

UNION ALL

SELECT * FROM (
  SELECT 
    m.MerchantName, 
    Count(r.OrderNo), 
    sum(r.commission)
  FROM
    revshare r
    LEFT JOIN Products p ON r.itemid = p.PID
    LEFT JOIN Merchants m ON p.MID = m.MID
  WHERE
    r.EventDate between '2011-02-01' and '2011-02-31'
  GROUP by
    r.itemid
  ORDER by
    3 DESC LIMIT 10
) AS RESULT2
于 2013-03-20T21:29:49.423 に答える
1

unionあなたはすでにing クエリのパスを一緒に始めているので、ここに正しいアプローチがあります:

select t.*
from ((SELECT '2011-01' as yyyymm, m.MerchantName, Count(r.OrderNo) as cnt, sum(r.commission) as comm
       FROM revshare r LEFT JOIN
            Products p
            ON r.itemid = p.PID LEFT JOIN
            Merchants m
            ON p.MID = m.MID
       WHERE r.EventDate between '2011-01-01' and '2011-01-31'
       GROUP by r.itemid
       ORDER by comm DESC
       LIMIT 10
      ) union all
      (SELECT '2011-02' as yyyymm, m.MerchantName, Count(r.OrderNo) as cnt, sum(r.commission) as comm
       FROM revshare r LEFT JOIN
            Products p
            ON r.itemid = p.PID LEFT JOIN
            Merchants m
            ON p.MID = m.MID
       WHERE r.EventDate between '2011-02-01' and '2011-02-28'
       GROUP by r.itemid
       ORDER by comm DESC LIMIT 10
      ) union all
      . . .
     ) t
order by 1, comm desc

つまり、 にはサブクエリを使用する必要がありますunion allyyyymm月を識別するために追加したことに注意してください。

于 2013-03-20T21:26:57.870 に答える