2011-03-20 76 views
1

为了简化,我有树表:productsproducts-vs-ordersorders如何分组并统计在一行中?

  1. products字段: '产品ID', '姓名', 'isGratis',...
  2. products-vs-orders字段: '产品ID',“订单ID”
  3. orders字段: '订单ID', '标题',...

其实,我有这样的查询:

SELECT orders.OrderID, orders.Title, COUNT(`products`.`isGratis`) AS "Quantity", `products`.`isGratis` 
FROM `orders`, `products-vs-orders`, `products` 
WHERE `orders`.`OrderID` = `products-vs-orders`.`OrderID` AND `products-vs-orders`.`ProductID` = `products`.`ProductID` 
GROUP BY `products`.`PackID`, `products`.`isGratis` 

这个查询工作,并返回这个需要收费的结果:

OrderID, Title,  Quantity, isGratis 
1   My Order  20   0 
1   My Order  3   1 
2   An other  8   0 
2   An other  1   1 

我怎样才能到单独的cols检索产品“免费”和“支付”的计数?

OrderID, Title,  Qt Paid,  Qt Gratis 
1   My Order  20    3 
2   An other  8    1 
+0

,因为你被products.PackID分组您的查询不应该工作,你的选择有orders.OrderID和orders.Title,它们都不在你的GROUP BY子句中。我认为你复制并粘贴错误。 – 2011-03-20 16:08:23

回答

4

试试这个:

SELECT 
    orders.OrderID, 
    orders.Title, 
    COUNT(orders.OrderId) - SUM(`products`.`isGratis`) AS "Qt Paid", 
    SUM(`products`.`isGratis`) AS "Qt Gratis" 
WHERE `orders`.`OrderID` = `products-vs-orders`.`OrderID` 
    AND `products-vs-orders`.`ProductID` = `products`.`ProductID` 
GROUP BY `products`.`PackID` 
+0

是的,它工作正常。感谢您的帮助。 – Akarun 2011-03-20 16:12:37

0
select orderid,title,sum(if(isgratis=0,quantity,0)) as paid,sum(if(isgratis=1,quantity,0)) as gratis from ... 
1

这应该是更合适的标准的SQL:

SELECT orders.OrderID, orders.Title, 
    SUM(CASE WHEN products.isGratis THEN 0 ELSE 1 END) AS "Qt Paid", 
    SUM(CASE WHEN products.isGratis THEN 1 ELSE 0 END) AS "Qt Gratis" 
FROM orders INNER JOIN `products-vs-orders` ON (orders.OrderID = `products-vs-orders`.OrderID) 
    INNER JOIN products ON (`products-vs-orders`.ProductID = products.ProductID) 
GROUP BY orders.OrderID, orders.Title 
+0

非常感谢!您的答案可以帮助我进行其他查询,并节省大量时间,然后+1。 – Akarun 2011-03-24 14:16:42

+0

没有probb,@Akarun。这是CASE声明的标准技巧,也是CASE最受欢迎的用法之一。 – 2011-03-25 00:12:04

相关问题