【问题标题】:How to display the top 3 products by revenue and their share in total revenue by year?如何按年显示收入前 3 的产品及其在总收入中的份额?
【发布时间】:2020-10-21 00:03:40
【问题描述】:

我有一个包含这些表的数据库。

  1. 用户(userId、年龄)
  2. 购买(purchaseId、userId、itemId、日期)
  3. 商品(itemId、价格)。

我需要按收入显示前 3 项(1 列),占总收入的份额(2 列)。

    Example: 
    itemid share
    1      20
    2      10 
    3      8

收入 = 购买商品数量 * 价格。

我的代码

SELECT Items.itemid, SUM(Items.price) FROM Purchases
LEFT JOIN Items ON Items.itemid = Purchases.itemId
WHERE strftime('%Y', Purchases.date) = '2020'
GROUP BY Items.itemid
ORDER BY Items.itemid DESC LIMIT 3

我不明白如何在SQL中计算收入百分比以及如何显示。

【问题讨论】:

  • 您使用的是哪个 dbms? (该查询是特定于产品的。)

标签: sql


【解决方案1】:

你可以使用窗口函数:

SELECT i.itemid, SUM(i.price),
       SUM(i.price) * 1.0 / SUM(SUM(i.price)) OVER () as ratio
FROM Purchases p JOIN
     Items i
     ON i.itemid = p.itemId
WHERE p.date >= '2020-01-01' AND
      p.date < '2021-01-01'
GROUP BY i.itemid
ORDER BY i.itemid DESC
LIMIT 3;

注意查询的变化:

  • 使用表别名,使查询更易写易读。
  • 日期过滤使用日期常量,因此优化器可以使用索引/分区(如果可用)。
  • 窗口函数提供您想要的总数。
  • LEFT JOIN 是不必要的。您需要匹配项目才能获得总价。

【讨论】:

  • 谢谢,但是比率显示为0,其他列显示正确imgur.com/YB3ekdD
  • @RoseVinnur 。 . .您正在使用的数据库可能正在使用整数除法。只需乘以 1.0。
猜你喜欢
  • 1970-01-01
  • 2022-01-20
  • 2021-08-23
  • 2021-12-06
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 2016-11-04
  • 2021-09-11
相关资源
最近更新 更多