SQLite:如何按Item列求和Price并保留对应Tag行的实现问题
正确SQL实现:按Item汇总Price并对应所有Tag行
原始表(TableQ)
| Item | Price | Tag |
|---|---|---|
| Item A | 2 | X |
| Item A | 4 | Y |
| Item B | 1 | Z |
期望输出
| Item | Price | Tag |
|---|---|---|
| Item A | 6 | X |
| Item A | 6 | Y |
| Item B | 1 | Z |
问题分析
你之前的SQL错误在于:子查询未按Item分组,也没有添加主表与子查询的关联条件,导致子查询计算的是全局Price总和(2+4+1=7),左连接后所有行都匹配这个全局值,不符合需求。
正确实现方案
方案1:使用窗口函数(推荐,简洁高效)
窗口函数可以直接按Item分组计算总价,同时保留原表的每一行数据:
SELECT Item, SUM(Price) OVER (PARTITION BY Item) AS Price, Tag FROM TableQ;
PARTITION BY Item指定按Item分组计算总和,OVER子句保证每一行都能获取到对应分组的总价。
方案2:使用关联子查询(兼容旧版数据库)
先通过子查询预计算每个Item的总价,再通过Item字段关联主表,将总价映射到每一行:
SELECT Q1.Item, Q2.PriceSum AS Price, Q1.Tag FROM TableQ Q1 INNER JOIN ( SELECT Item, SUM(Price) AS PriceSum FROM TableQ GROUP BY Item ) Q2 ON Q1.Item = Q2.Item;
子查询通过GROUP BY Item得到每个Item的总价,再通过ON Q1.Item = Q2.Item将主表的每一行与对应Item的总价关联。
内容的提问来源于stack exchange,提问作者user0758
相关产品推荐
相关产品推荐

