使用“天内”等标准计算记录

时间:2011-07-01 14:34:19

标签: sql

我在sql上有一个如下表。

OrderID Account  OrderMethod     OrderDate  DispatchDate  DispatchMethod 
2145     qaz     14              20/3/2011  23/3/2011     2
4156     aby     12              15/6/2011  25/6/2011     1

我想计算所有在发货日期后30天内重新订购的记录,其中Dispatch Method为'2'且OrderMethod为'12'并且它来自同一帐户。

我想问这一切是否可以通过一个查询实现,还是我需要创建不同的表并按阶段进行,因为我认为我现在必须做什么?有人可以帮忙查询代码/查询吗?

非常感谢 T

5 个答案:

答案 0 :(得分:2)

尝试以下操作,将[tablename]替换为您的表名。

SELECT Count(OriginalOrders.OrderID) AS [Total_Orders]
FROM [tablename] AS OriginalOrders  
INNER JOIN [tablename] AS Reorders  
ON OriginalOrders.Account = Reorders.Account  
AND OriginalOrders.OrderDate < Reorders.OrderDate  
AND DATEDIFF(day, OriginalOrders.DispatchDate, Reorders.OrderDate) <= 30  
AND Reorders.DispatchMethod = '2'  
AND Reorders.OrderMethod = '12';

通过使用内部联接,您将确保只获取符合所有条件的订单 通过链接两个表(使用别名基本上是相同的表),您可以确保只计算同一帐户下的订单。
联接的结果将根据您提到的标准进一步过滤,只需要在上一个订单的发货日期后30天内下达的订单。

答案 1 :(得分:0)

完全可以使用一个查询,但我的SQL有点陈旧......

select count(*) from table 
where DispatchMethod = 2
    AND OrderMethod = 12
    AND DATEDIFF(day, OrderDate, DispatchDate) <= 30;

(未经测试,但它类似)

答案 2 :(得分:0)

一个查询可以做到。

SELECT COUNT(*)FROM myTable reOrder
INNER JOIN myTable originalOrder
  ON reOrder.Account = originalOrder.Account
  AND reOrder.OrderID <> originalOrder.OrderID
  -- all re-orders that are within 30 days or the 
  -- original orders dispatch date
  AND DATEDIFF(d, originalOrder.DispatchDate, reOrder.OrderDate) <= 30
WHERE reOrder.DispatchMethod = 2
  AND reOrder.OrderMethod = 12

答案 3 :(得分:0)

您需要自我加入。

下面的查询假定某个帐户在表格中有1条或2条记录 - 如果已重新排序则为2条,否则为1.

如果给定帐户存在3条记录,则2个订单+ 1个重新订购,那么这将无效 - 但我们需要更多关于如何区分订单和重新订购的信息。

 SELECT COUNT(*) FROM myTable new, myTable prev
 WHERE new.DispatchMethod = 2
 AND new.OrderMethod = 12
 AND DATEDIFF(day, prev.DispatchDate, new.OrderDate)  <=30
 AND prev.Account == new.Account 
 AND prev.OrderDate < new.OrderDate

答案 4 :(得分:0)

在这种情况下我们可以使用GROUP BY,例如以下内容吗?

SELECT COUNT(Account) 
FROM myTable
WHERE DispatchMethod = 2 AND OrderMethod = 12 
AND DATEDIFF(d, DispatchDate, OrderDate)  <=30
GROUP BY Account

上述工作会不会或我错过了什么?