【问题标题】:Trying to get TOP 10 products per sales channel试图获得每个销售渠道的 TOP 10 产品
【发布时间】:2014-12-30 07:35:17
【问题描述】:

我已经找到了一些答案,但在这里没有任何帮助。我需要一个查询来查找一个月内每个销售渠道(总共 5 个)的前 10 种产品。我用一个可怕的 union all 查询试试运气,但我没有得到我需要的结果。 (我认为我写的查询不是最好的,反正......)

SELECT a.SKU, a.ProductName, b.SalesChannel, sum(a.PurchasedQuantity) as pq
FROM all_all_orders_items a
INNER JOIN all_all_orders b ON b.AmazonOrderID = a.AmazonOrderID
WHERE b.SalesChannel = 1 AND b.PurchaseDate  BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
GROUP BY a.SKU, b.SalesChannel
UNION ALL
SELECT a.SKU, a.ProductName, b.SalesChannel, sum(a.PurchasedQuantity) as pq
FROM all_all_orders_items a
INNER JOIN all_all_orders b ON b.AmazonOrderID = a.AmazonOrderID
WHERE b.SalesChannel = 2 AND b.PurchaseDate  BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
GROUP BY a.SKU, b.SalesChannel
UNION ALL
SELECT a.SKU, a.ProductName, b.SalesChannel, sum(a.PurchasedQuantity) as pq
FROM all_all_orders_items a
INNER JOIN all_all_orders b ON b.AmazonOrderID = a.AmazonOrderID
WHERE b.SalesChannel = 3 AND b.PurchaseDate  BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
GROUP BY a.SKU, b.SalesChannel
UNION ALL
SELECT a.SKU, a.ProductName, b.SalesChannel, sum(a.PurchasedQuantity) as pq
FROM all_all_orders_items a
INNER JOIN all_all_orders b ON b.AmazonOrderID = a.AmazonOrderID
WHERE b.SalesChannel = 4 AND b.PurchaseDate  BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
GROUP BY a.SKU, b.SalesChannel
UNION ALL
SELECT a.SKU, a.ProductName, b.SalesChannel, sum(a.PurchasedQuantity) as pq
FROM all_all_orders_items a
INNER JOIN all_all_orders b ON b.AmazonOrderID = a.AmazonOrderID
WHERE b.SalesChannel = 5 AND b.PurchaseDate  BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
GROUP BY a.SKU  , b.SalesChannel
ORDER BY pq DESC LIMIT 10

在不查询 db 5 次的情况下获得结果的最佳方法是什么?

现在我只得到整体上最好的产品——但不是特定的销售渠道......

【问题讨论】:

    标签: mysql sql select group-by greatest-n-per-group


    【解决方案1】:

    试试这个:

    SELECT A.SKU, A.ProductName, A.SalesChannel, A.pq
    FROM (SELECT A.SKU, A.ProductName, A.SalesChannel, A.pq, 
                 IF(@SalesChannel = @SalesChannel:=A.SalesChannel, @RowId:=@RowId + 1, @RowId:=1) AS RowNum
          FROM (SELECT a.SKU, a.ProductName, b.SalesChannel, SUM(a.PurchasedQuantity) as pq
                FROM all_all_orders_items a
                INNER JOIN all_all_orders b ON b.AmazonOrderID = a.AmazonOrderID
                WHERE b.SalesChannel IN (1, 2, 3, 4, 5) AND b.PurchaseDate  BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
                GROUP BY a.SKU, b.SalesChannel
                ORDER BY b.SalesChannel, pq DESC
              ) AS A, (SELECT @SalesChannel:=0, @RowId:=1) AS B
          ORDER BY A.SalesChannel, A.pq DESC
         ) AS A 
    WHERE A.RowNum <= 10
    ORDER BY A.SalesChannel, A.RowNum;
    

    【讨论】:

    • 嗨@Saharsh Shah ..不错的答案。如果你不介意我有一个问题要问你。你是怎么知道表结构的?仅来自 PO 的给定查询?
    • 我也没有得到这种情况。 @SalesChannel = @SalesChannel:=A.SalesChannel你能帮我理解一下吗?
    【解决方案2】:

    也许这种查询可能有用:

    SELECT 
       b.SalesChannel, a.SKU, a.ProductName, b.SalesChannel, sum(a.PurchasedQuantity) as pq
    FROM 
       all_all_orders_items a
       INNER JOIN all_all_orders b ON b.AmazonOrderID = a.AmazonOrderID
    WHERE 
       b.SalesChannel IN (1, 2, 3, 4, 5) AND b.PurchaseDate  BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
    GROUP BY 
       b.SalesChannel, a.SKU, b.SalesChannel
    ORDER BY
       b.SalesChannel ASC, pq DESC LIMIT 50
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2021-01-07
      • 1970-01-01
      • 2021-03-28
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 2017-10-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多