将不同项目分组到存储桶中的 sql 查询

新手上路,请多包涵

我正在尝试编写一个查询,该查询返回价格落入特定存储桶的商品数量:

例如,如果我的表是:

 item_name | price
i1        | 2
i2        | 12
i3        | 4
i4        | 16
i5        | 6

输出:

 range   | number of item
0 - 10  |  3
10 - 20 |  2

到目前为止我的做法是

SELECT count(*)
FROM my_table
Where price >=0
and price <10

然后

SELECT count(*)
FROM my_table
Where price >=10
and price <20

然后每次将我的结果复制粘贴到excel中。

在 sql 查询中是否有自动执行此操作的方法?

原文由 samuel_C 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 249
2 个回答

Kerrek 描述的扩展选项,您可以根据案例/时间进行分组

select
      case when price >= 0 and price <= 10    then '  0 - 10'
           when price > 10 and price <= 50   then ' 10+ - 50'
           when price > 50 and price <= 100  then ' 50+ - 100'
           else 'over 100'
      end PriceRange,
      count(*) as TotalWithinRange
   from
      YourTable
   group by 1

在这里,“按 1 分组”表示您的 select 语句中的序数列……在这种情况下,case/when 为 TotalWithinRange。

原文由 DRapp 发布,翻译遵循 CC BY-SA 4.0 许可协议

这是一个简单的mysql解决方案。首先,根据价格值计算桶索引。

 select *, floor(price/10) as bucket from mytable

 +------+-------+--------+
| name | price | bucket |
+------+-------+--------+
| i1   |     2 |      0 |
| i2   |    12 |      1 |
| i3   |     4 |      0 |
| i4   |    16 |      1 |
| i5   |     6 |      0 |
+------+-------+--------+

接下来,按桶索引分组并计算价格总和并格式化 prange 列。

 select concat(bucket * 10, '-', (bucket * 10 - 1) + 10) as prange, count(price)
from  (select *, floor(price/10) as bucket from mytable) t1
group by bucket;

 +--------+--------------+
| prange | count(price) |
+--------+--------------+
| 0-9    |            3 |
| 10-19  |            2 |
+--------+--------------+

原文由 Harshith Bolar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进