テーブル構造の前置きをします。
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