这是我在Stack Overflow上的第一篇文章,我很欣赏并会接受任何积极的批评,以便更好地形成任何未来的问题。
问题: 我正在尝试创建一个Select查询,在那里收集所有只有前八项的订单。
我正在使用MS-Access 2013.
我当前的查询无效,看起来像这样。
SELECT OrderID
From DirectOrders
WHERE OrderID <> ANY
(
SELECT OrderID
FROM DirectOrders
WHERE SKU <> ANY
(
SELECT TOP 8 SKU
FROM DirectOrders
GROUP BY SKU
ORDER BY COUNT(SKU) DESC
)
)
下面的单个表格。
OrderID Customer SKU Qty
177622 CustomerA 1001 20
177622 CustomerA 1002 2
177624 CustomerB 1001 200
177626 CustomerC 1003 50
177626 CustomerC 1004 150
177630 CustomerC 1005 1000
177632 CustomerA 1006 1
177632 CustomerA 1007 3
177632 CustomerA 1008 9
177632 CustomerA 1009 1
177632 CustomerA 1010 4
177632 CustomerA 1011 3
177634 CustomerC 1012 5
177634 CustomerC 1013 5
177640 CustomerD 1014 4
177642 CustomerA 1015 4
177642 CustomerA 1016 48
177642 CustomerA 1017 15
177644 CustomerB 1018 50
这是我试图完成的流程。
答案 0 :(得分:1)
我会用聚合来做到这一点:
other_data flag_a flag_b flag_c
1 1 1 0 1
2 2 0 1 0
3 3 0 0 1
注意:
desired_result <- data.frame(other_data=c(1,1,2,3), flag=c("a", "c","b","c"))
desired_result
确实是 other_data flag
1 1 a
2 1 c
3 2 b
4 3 c
。要获得完全 8值,您需要打破平局。此查询使用SELECT do.OrderID
FROM DirectOrders as do LEFT JOIN
(SELECT TOP 8 SKU
FROM DirectOrders
GROUP BY SKU
ORDER BY COUNT(SKU) DESC, SKU
) as s8
ON do.SKU = s8.SKU
GROUP BY do.OrderId
HAVING COUNT(*) = COUNT(s8.SKU);
来实现此目的。TOP
确定订单中的每件商品与前8件商品之间是否匹配。TOP WITH TIES
子句说:带有项目的行数与匹配前8个行的行数相同。因此,所有行都在顺序中。答案 1 :(得分:0)
我认为你需要这样的东西。但是,如果使用计数SKU,可能会得到一些奇怪的结果,因为除了1001之外,其他SKU的计数为1.因此,除了1001之外,所有其他SKU都基于计数(SKU)位于前8位
SELECT * FROM DirectOrderswhere SKU in (按SKU顺序(SKU)desc)从DirectOrders组中选择前8个SKU;
答案 2 :(得分:0)
Access的TOP功能不会破坏联系,因此它不会仅报告前8名,而是按订单排序,然后报告足以涵盖您输入的最高价值以及所有关联。例如,对于您的示例数据,如果您排在前8位或只排在前2位,它将报告相同的17条记录,因为除{1}之外的所有SKU
只有1个订单。
如果您只想报告前8位,则应添加到查询中以使排序唯一。在这种情况下,我可能会按COUNT(SKU) DESC, COUNT(QTY) DESC, MAX(ORDERID) desc, SKU
排序,以便它优先处理最高订单数量,最高数量,然后根据最新的OrderID
选择该sku,如果所有其他方法都失败,由SKU
本身订购。只有SKU
保证每行都是唯一的,但如果您正在寻找真正相关的&#34;前8&#34;那么仅按SKU
排序可能无法获得最佳结果。< / p>
SELECT OrderID
From DirectOrders
WHERE OrderID NOT IN
(
SELECT OrderID
FROM DirectOrders
WHERE SKU NOT IN
(
SELECT TOP 8 SKU
FROM DirectOrders
GROUP BY SKU
ORDER BY COUNT(SKU) DESC, SUM(QTY) DESC, MAX(ORDERID) DESC, SKU
)
)