我在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
答案 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
上述工作会不会或我错过了什么?