2011-04-28 92 views
0

如何将多个查询合并为一个?将多个查询合并为一个(报告)?

例如:

//Successful Sales: 
SELECT username, count(*) as TotalSales, sum(point) as Points FROM sales where submit_date >= 1301612400 AND submit_date <= 1304204400 AND status = 1 group by username 

/Return Sales: 
SELECT username, count(*) as Return FROM sales where submit_date >= 1301612400 AND submit_date <= 1304204400 AND status = 2 group by username 

//Unsuccessful Sales: 
SELECT username, count(*) as UnsuccessfulSales FROM sales where submit_date >= 1301612400 AND submit_date <= 1304204400 AND (status = 3 OR status = 6) group by username 

所以该报告是这个样子: enter image description here

还有如何增加收益的百分比是多少?

注:固定SQL查询

我已经试过这样做,但不能得到它的工作?

SELECT username, TotalSales, Points, Return 
    FROM (
     SELECT username, count(*) as TotalSales, sum(point) as Points FROM sales where submit_date >= 1301612400 AND submit_date <= 1304204400 AND status = 1 group by username 
     UNION 
     SELECT count(*) as Return FROM sales where submit_date >= 1301612400 AND submit_date <= 1304204400 AND status = 4 group by username 
    ) 

..

// Example Data Structure 

     CREATE TABLE IF NOT EXISTS `sales2` (
      `salesid` int(11) NOT NULL AUTO_INCREMENT, 
      `username` varchar(50) NOT NULL, 
      `point` int(11) NOT NULL, 
      `status` int(11) NOT NULL, 
      PRIMARY KEY (`salesid`) 
     ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ; 

     INSERT INTO `sales2` (`salesid`, `username`, `point`, `status`) VALUES 
     (1, 'User1', 2, 1), 
     (2, 'User1', 2, 1), 
     (3, 'User2', 11, 1), 
     (4, 'User2', 1, 2), 
     (5, 'User3', 5, 6); 

场状态= 1,成功的销售和展示点

状态2 - 退货销售

状态3/6 - 不成功销售:

回答

1

更新: 对于你的第一个问题,我认为这将做你想做的事情(但要注意,这个查询是狗慢,充满表扫描...你应该要求一个更有经验的堆栈溢出用户来优化为你):

SELECT 
    distinct(outer_sales.username), 
    (SELECT count(*) as Points FROM sales where status = 1 AND username = outer_sales.username) as TotalSales, 
    (SELECT sum(point) as Points FROM sales where status = 1 AND username = outer_sales.username) as Points, 
    (SELECT count(*) FROM sales where status = 2 AND username = outer_sales.username) as Return, 
    (SELECT count(*) FROM sales where (status = 3 OR status = 6) AND username = outer_sales.username) as UnsuccessfulSales 
FROM 
    sales outer_sales 
ORDER BY 
    outer_sales.username; 

而对于第二个问题,如果你只是想百分号添加到Return列,您可以使用CONCAT功能:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat

尝试:

SELECT CONCAT(CAST(COUNT(*) AS CHAR), '%') AS Return ... 
+0

谢谢,第一个问题呢。我对此有所了解。 – user622378 2011-04-28 15:00:26

+0

你可以发表你的表DDL和一些插入语句列表,这样我就可以玩了。该查询可能不会那么有效,因为我无法考虑一种方法来过滤不同字段的不同状态而不诉诸内部查询。 – 2011-04-28 15:16:37

+0

刚刚更新了我的问题与一些插入语句列表和表 – user622378 2011-04-28 15:49:33

1

如果查询中列的数量(和类型)匹配,则可以使用UNION将结果在3个查询中。

+0

我已经试过了,不可能得到它的工作。你能举个例子吗? – user622378 2011-04-28 14:57:26

+0

重要的是列的匹配。你会做类似于选择col1,col2从... UNION选择col1,col2从... UNION选择col1,col2从... – 2011-04-28 15:21:57

+0

这是我试过,无法开始工作:SELECT用户名,TotalSales,点,返回 FROM( SELECT用户名,COUNT(*)作为TotalSales,总和(点)作为积分FROM销售其中submit_date> = 1301612400 AND submit_date <= 1304204400和状态= 1组由用户名 UNION SELECT COUNT(*)作为返回FROM销售where submit_date> = 1301612400 AND submit_date <= 1304204400 AND status = 4 group by username ) – user622378 2011-04-28 15:28:46