2012-02-08 72 views
0

我玩过很多不同的查询,但一直没有找到正确的语法为这个项目..我真的希望有人可以理解我的烂摊子。MySQL查询与集团

我有一个订单表,每个订单一行,每行都包含客户编号,采购订单编号和订单日期等信息。采购订单号码可以绑定到一个或多个订单,这是我迷路的地方。我试图创建一个包含客户编号,PO#,最早订单日期和最后一个订单日期(根据PO#分组)的单个行的查询。

任何指向正确的方向将非常感谢!

+1

?那最早的订单?最后一个订单的那个?还有别的吗? – 2012-02-08 19:20:43

+0

具有相同'PO'的所有行都具有相同的'CustomerNumber'吗? – 2012-02-08 19:21:53

回答

2

这将获得订单和范围的东西...

select 
     o.PONumber, 
     o.CustomerID, 
     count(*) as TotalOrders, 
     min(o.OrderID) as FirstOrder, 
     min(o.OrderDate) as FirstOrderDate, 
     max(o.OrderID) as LastOrder, 
     max(o.OrderDate) as LastOrderDate 
    from 
     Orders o 
    group by 
     o.PONumber, 
     o.CustomerID 
+0

哇...干净,简单,像魅力一样工作! – Jimmyb 2012-02-08 20:19:01

0

试试这个:

SELECT 
    o1.`customer_number` as 'customer', 
    o1.`po` as 'po_number', 
    (
     SELECT 
      MIN(`date`) 
     FROM 
      `orders` 
     WHERE 
      `id` = o1.`id` 
    ) as 'earliest_date' 
FROM 
    `orders` o1 
GROUP BY 
    o1.`po` 

希望有所帮助。

+0

通过做一个子选择作为一个列将是一个很大的性能影响,特别是在较大的表上。它要求为每个ID调用每个SELECT MIN(),而在所有合格记录中使用标准MIN()/ MAX()。您拥有每个P/O产生相同记录的组 – DRapp 2012-02-08 19:35:12

0
SELECT o.custumer, o.po_number, o.order_count, max.max_date, min.min_date 
FROM 
(
SELECT o.'costumer_number' as 'custumer', o.'po' as 'po_number', count('order_number') as 'order_count' 
FROM 'orders' o 
GROUP BY o.'costumer_number', o.'po' 
) o 
INNER JOIN (
    SELECT o.'costumer_number' as 'custumer', o.'po' as 'po_number', MAX('order_date') as 'max_date' 
    FROM 'orders' o 
    GROUP BY o.'costumer_number', o.'po'  
) max ON o.'customrer' = max.'costumer' and o.'po_number' = max.'po_number' 
INNER JOIN (
    SELECT o.'costumer_number' as 'custumer', o.'po' as 'po_number', min('order_date') as 'min_date' 
    FROM 'orders' o 
    GROUP BY o.'costumer_number', o.'po'  
) min ON o.'customrer' = min.'costumer' and o.'po_number' = min.'po_number' 
ORDER BY 1,2 

这shold清除出来你要哪`PO#`