2013-03-20 61 views
0

寻找前10名的记录,我会用表结构前言:MySQL的 - 按月

收入分成R:包含用于购买包括orderNo,销售,佣金,商品ID信息,EVENTDATE

产品号码:包含的信息围绕包含PID(产品ID)的产品,用于加入商户表以获取商家信息。

招商L:包含有关商家的产品从购买,包括MERCHANTNAME

信息

问题

我想创建一个MySQL查询拉排名前10位的itemid的有序佣金的总和给定月份。我希望得到的整个数据集是2011-2013年,因此每年将填充120个记录(每月10个)。

我创建了一个查询来提取1个月的数据,并计划使用UNION ALL来创建一个记录列表,每个查询包含10条记录(每个查询代表一个月前10位的itemid)。

查询1

该查询返回准确我根据在给定的月期间这些项目的总佣金前10名的itemid的。

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此查询与另一个,这样我可以得到“2011-02-01”之间下个月记录和“2011年2月31日”我得到的和错误“错误:不正确使用UNION和ORDER BY“我知道这是因为显然你不能在任何一组UNION查询中使用ORDER BY,而是使用ORDER BY。我可以提取整个数据集,然后使用Excel或Pentaho BI仅显示前10位,但基于revshare表中庞大的数据集无效。

以下是查询UNION ALL不起作用。有没有人有更好的方法来提取这些数据?

任何帮助,非常感谢。

问候, 克里斯

查询2既然你已经开始下降的union ING查询路径一起

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 
+0

你打电话 “以便通过3”。指令顺序正在查找列名称。 – 2013-03-20 20:56:42

+1

没有指令顺序使用列位置或列名称,这不是问题。问题在于UNION情况下的指令顺序。所以我可以说“ORDER BY 3”或“ORDER BY r。佣金”,这意味着同样的事情。 – 2013-03-21 19:03:47

+0

学习新的东西每一天。 – 2013-03-21 19:41:07

回答

2

好吧,试试这个....

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 
+0

有人打我给它笑... – 2013-03-20 21:30:52

+0

完美解决,谢谢查克,我现在看到,我需要subquery工会。非常感谢。 – 2013-03-21 19:10:39

1

(不因为ORDER BY语句的工作),在这里是正确的方法:

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 all。请注意,我还在yyyymm中添加了识别月份。

+1

这工作为好,非常感谢戈登,并感谢你两次你我不必使用子查询的解释。很感激。 – 2013-03-21 19:11:34