SQL如何实现按币种统计数量金额并转为同行动态多列展示
实现前提
假设你的数据表名为currency_records,包含3个核心字段:
id:分组IDcurrency_code:币种编码amount:对应交易金额
固定币种统计方案
如果你要统计的币种是固定的(比如示例里的123、456),直接用条件聚合就能实现,该写法兼容MySQL、PostgreSQL、Oracle、SQL Server等所有主流数据库:
SELECT id AS ID, COUNT(*) AS Total_Number, SUM(amount) AS Total_Sum, SUM(CASE WHEN currency_code = 123 THEN 1 ELSE 0 END) AS Number_Currency_123, SUM(CASE WHEN currency_code = 123 THEN amount ELSE 0 END) AS Sum_Currency_123, SUM(CASE WHEN currency_code = 456 THEN 1 ELSE 0 END) AS Number_Currency_456, SUM(CASE WHEN currency_code = 456 THEN amount ELSE 0 END) AS Sum_Currency_456 -- 有其他要统计的币种,直接按照上面的格式新增CASE WHEN语句即可 FROM currency_records GROUP BY id ORDER BY id;
逻辑很简单:统计每条记录的时候,如果符合对应币种的条件就计数+1/累加对应金额,不符合就加0,按ID分组汇总后就能得到每个ID各维度的统计值。
非固定币种扩展说明
如果币种类型不固定、没法提前穷举写死,就需要用动态SQL拼接实现,不同数据库的动态SQL语法有差异:
- MySQL用
PREPARE+EXECUTE实现 - PostgreSQL用
format()函数拼接后执行 - Oracle用
EXECUTE IMMEDIATE实现
内容的提问来源于stack exchange,提问作者sqlnewbie
相关产品推荐
相关产品推荐

