2010-07-03 47 views
2

分组计数我有以下两个表我的订单处理系统的一部分:选择多个项目,按日期

order(id, date) 
order_item(order_id, item_id, type) 

的类型是指哪个表看order_item起来枚举。

我想编写一个查询,选择每天订购的不同项目类型的数量。所以它应该产生类似于:

Date   tshirts dvds mugs cds 
07/07/2010 3   6  2  2 
10/07/2010 4   9  3  1 
13/07/2010 1   2  1  9 

这是查询我目前必须选择一种类型的计数。我只是不能解决如何扩展它来选择多种类型的计数。

SELECT DATE(order.date), COUNT(order.date) 
FROM order, order_item 
WHERE order.id = order_item.order_id AND order_item.type = 'tshirts' 
GROUP BY DATE(order.date) 

回答

0

这里是什么对我的作品(与MySQL):

SELECT o.date, COUNT(if(oi.type='tshirts', 1, NULL)) as tshirts, COUNT(if(oi.type='mugs', 1, NULL)) as mugs 
FROM order_item oi LEFT JOIN order o ON oi.order_id = o.id 
GROUP BY o.date 
0

它不会给你你想要什么东西

SELECT DATE(order.date), COUNT(order_item.type) as count , order_item.type as type 
FROM order, order_item 
WHERE order.id = order_item.order_id AND order_item.type = 'tshirts' 
GROUP BY DATE(order.date), order_item.type 

它会给类似follwing

Date   type  count    
07/07/2010 tshirts 3  
07/07/2010 dvds  6  
07/07/2010 mugs  2  
07/07/2010 cds  2 
10/07/2010 tshirts 4  
10/07/2010 dvds  9  
10/07/2010 mugs  3  
10/07/2010 cds  1 
13/07/2010 tshirts 1  
13/07/2010 dvds  2  
13/07/2010 mugs  1  
13/07/2010 cds  9 

两个缺点,我知道是

  1. 日期会重复
  2. 它不会计算哪一个为零
0

这里是我结束了使用查询:

SELECT DATE(order.date) AS day, 
    (SELECT COUNT(order.date) 
    FROM order, order_item 
    WHERE DATE(order.date) = day AND 
     order.id = order_item.order_id AND 
     order_item.type = 'tshirt') AS tshirt, 
    (SELECT COUNT(order.date) 
    FROM order, order_item 
    WHERE DATE(order.date) = day AND 
     order.id = order_item.order_id AND 
     order_item.type = 'mugs') AS mugs, 
    etc. 
FROM order 
GROUP BY DATE(order.date) 

这是令人难以置信的慢,但它的工作。

+0

考虑检查我的查询,它不使用子查询,所以应该更快 – bsboris 2010-07-03 07:30:37

1

您不应该使用逗号语法来进行连接。使用使用INNER JOIN关键字的ISO语法,该关键字可以缩短为JOIN。

Select O.Date 
    , Sum(Case When OI.Type = 'tshirts' Then 1 Else 0 End) As tshirts 
    , Sum(Case When OI.Type = 'dvds' Then 1 Else 0 End) As dvds 
    , Sum(Case When OI.Type = 'mugs' Then 1 Else 0 End) As mugs 
    , Sum(Case When OI.Type = 'cds' Then 1 Else 0 End) As cds 
From Order As O 
    Join Order_Item As OI 
     On OI.order_id = O.id 
Where OI.type In('tshirts','dvds','mugs','cds') 
Group By O.Date