根据多个子查询

时间:2016-12-12 17:24:21

标签: sql ms-access

这是我在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

这是我试图完成的流程。

  1. 按计数选择前8名SKU
  2. 选择没有其中一个SKU
  3. 的所有订单ID
  4. 选择所有订单ID不属于列表2中所选订单ID的一部分。

3 个答案:

答案 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

注意:

  • 在MS Access中,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
    )
)