按销售额在30天内订购产品,然后是无销售额的产品

p4tfgftt  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(327)

我想取一份过去30天内按销售数量订购的产品清单。
我将如何使以下查询也按销售数量在过去30天内,并让他们后面的产品,没有销售的东西,在这30天?
我需要那些在过去30天内先有销售,然后是没有任何销售后的产品。
包含销售日期的字段是 datetime 调用的字段 orders.sold_time 这是我当前的查询:

SELECT    pd.products_id AS id, pd.products_name AS name
FROM      products_description pd
LEFT JOIN products ON pd.products_id = products.products_id
LEFT JOIN orders_products ON pd.products_id = orders_products.products_id
LEFT JOIN orders ON orders_products.orders_id = orders.orders_id
WHERE     pd.c5_dataset = 'DAT'
AND       products.products_status =1
AND       pd.language_id =4
AND       NOT EXISTS (
              SELECT 1
              FROM   products_description
              WHERE  products_id = pd.products_id
              AND    language_id = 10
          )
AND       orders_total.class = 'ot_total'
GROUP BY  pd.products_id
ORDER BY  count( orders_products.products_quantity ) DESC
5cg8jx4n

5cg8jx4n1#

你可以使用 case when 表达方式。表示最近30天的销售量的表达式是:

sum(case when orders.sold_time >= date_add(curdate(), interval -30 day) 
         then orders_products.products_quantity 
    end)

你可以把这个放在箱子里 order by 条款,然后你方应决定订购过去30天内没有销售的商品。例如,这可能是所有时间的销售数量。
我还会为所有表使用别名(就像第一个表一样)。所以呢 o 为了 orders , op 为了 orders_products .
那么你的 order by 看起来像:

order by sum(case when o.sold_time >= date_add(curdate(), interval -30 day) 
                  then op.products_quantity 
             end),
         sum(op.products_quantity)

为了检查结果,最好也将这两个表达式添加到 select 列表。

关于sql的一些注解:

因为你有一个非空的条件 products.products_status (=1)没有充分的理由使用 LEFT JOIN products . 而是使用更有效的 INNER JOIN .
如果你更换新的机器,你可能会提高效率 NOT EXISTS 带有 INNER JOIN 条款:

INNER JOIN products_description p2
       ON p2.products_id = pd.products_id
      AND p2.language_id = 10

前提是每个产品和语言最多只能有一个描述。

相关问题