SQL中如何关联数值列与字符列以筛选买卖数量符合要求的记录
解决方案
方法1:GROUP BY + 条件聚合(最常用,全SQL dialect兼容)
如果只需要输出符合「买入总量>卖出总量」的产品及对应统计值,用这种方法性能最高:
SELECT Product, SUM(CASE WHEN LOWER(Action) = 'buy' THEN Quantity ELSE 0 END) AS total_buy, SUM(CASE WHEN LOWER(Action) = 'sell' THEN Quantity ELSE 0 END) AS total_sell FROM 你的表名 GROUP BY Product HAVING SUM(CASE WHEN LOWER(Action) = 'buy' THEN Quantity ELSE 0 END) > SUM(CASE WHEN LOWER(Action) = 'sell' THEN Quantity ELSE 0 END)
说明:
- 用
LOWER()是为了兼容Action字段大小写不统一的情况,比如样例里的首字母大写"Buy",如果你的字段值格式完全统一可以去掉该函数 - 如果需要筛选特定产品,在
GROUP BY前加WHERE Product = '目标产品名'即可 - 样例表测试该语句会返回abc产品,对应total_buy=10、total_sell=9,符合需求
方法2:窗口函数(适合保留原始交易明细的场景)
如果需要返回符合条件的产品的所有原始交易记录,用该方法:
SELECT * FROM ( SELECT *, SUM(CASE WHEN LOWER(Action) = 'buy' THEN Quantity ELSE 0 END) OVER (PARTITION BY Product) AS total_buy, SUM(CASE WHEN LOWER(Action) = 'sell' THEN Quantity ELSE 0 END) OVER (PARTITION BY Product) AS total_sell FROM 你的表名 ) t WHERE total_buy > total_sell
说明:该语句会返回abc产品对应的2条原始交易记录,同时附带该产品的总买卖量字段。
内容的提问来源于stack exchange,提问作者Liz
相关产品推荐
相关产品推荐

