如何编写带有数量单位转换的分组查询SQL?

Posted

技术标签:

【中文标题】如何编写带有数量单位转换的分组查询SQL?【英文标题】:how to write group-by query SQL with quantity unit conversion? 【发布时间】:2019-04-03 23:31:11 【问题描述】:
Stock

Product  Quantity  Unit 
-------------------------------
001       5        box
001       10       bottle
001       60       gallon


Conversion

Unit1     Unit2    Rate
----------------------
box       bottle    20
bottle    gallon    30

Unit1 = Unit2 * Rate

如何编写SQL查询求和(数量)以一定的单位(如示例中的瓶子)?

select product, sum(quantity * ....) from Stock group by product

像 getRate(unit1, unit2) 这样的数据库函数可以完成这项工作吗?性能怎么样?

【问题讨论】:

预期的输出是什么? 【参考方案1】:

您需要展开转换表,使其包含所有组合。这是一次性的工作,但您需要像这样添加行:

Unit1     Unit2    Rate
----------------------
box       bottle    20
bottle    gallon    30
gallon    bottle    1/30

然后你可以使用LEFT JOIN:

SELECT s.product, SUM(s.quantity * coalesce(c.rate, 1))
FROM stock s LEFT JOIN
     conversion c 
     ON s.unit = c.unit1 AND c.unit2 = 'bottle'
GROUP BY s.product

【讨论】:

有没有办法即时添加这些额外费率,例如使用视图?谢谢。 @Sunnyday 。 . .它可能变得相当复杂,需要某种递归 CTE。 添加额外费率会使用户更难管理。自定义函数 getRate(unit1, unit2) 怎么样?谢谢。 @SunnyDay 。 . .这取决于您使用的是什么数据库以及您必须处理多少个不同的单元。一个函数是可以的,但通常会影响性能——如果表很大的话。

以上是关于如何编写带有数量单位转换的分组查询SQL?的主要内容,如果未能解决你的问题,请参考以下文章

ABAP 数量单位转换

使用分组转换/转换的 SQL 查询

带有数字格式(单位)的高位图表

SQL FIFO库存查询用于老化一个动态的单位数量

如何编写一个简单的java程序,可以在单个单元中转换一系列时间? (例如以毫秒为单位)[关闭]在线尝试!

grafana中的温度单位转换