如何使用SQLite将数据映射到对应行并更新统计列值?
解决SQLite供应商数据与分类表的映射问题
嘿,我来帮你搞定这个需求!先把你的数据和目标理清楚,再给出完善后的SQL语句。
先明确你的数据和目标
现有供应商数据(假设表名为suppliers)
| supplier | count |
|---|---|
| 120 | 50 |
| 121 | 45 |
| 129 | 151 |
| 151 | 0.5 |
初始的categories表结构
| Category | Discription | number_of_suppliers |
|---|---|---|
| A | count | NULL |
| B | 0<=count<40 | NULL |
| C | 40.1<count | NULL |
你期望的最终结果
| Category | Discription | number_of_suppliers | 对应供应商 |
|---|---|---|---|
| A | count | 1 | 129 |
| B | 0<=count<40 | 1 | 151 |
| C | 40.1<count | 2 | 120, 121 |
完善后的SQL方案
方案1:直接查询得到完整映射结果
如果你只是需要查询出目标结果(不需要修改categories表),用下面的语句就行,它会同时统计供应商数量并拼接对应ID:
SELECT c.Category, c.Discription, COUNT(s.supplier) AS number_of_suppliers, GROUP_CONCAT(s.supplier, ', ') AS 对应供应商 FROM categories c LEFT JOIN suppliers s ON -- 匹配每个分类的供应商条件 (c.Category = 'A' AND s.count = 151) -- A类对应count=151的供应商129 OR (c.Category = 'B' AND s.count >= 0 AND s.count < 40) OR (c.Category = 'C' AND s.count > 40.1) GROUP BY c.Category, c.Discription;
方案2:更新categories表的number_of_suppliers字段
如果需要把统计的数量更新到categories表中,SQLite不支持UPDATE ... FROM的写法,所以用子查询来实现:
UPDATE categories SET number_of_suppliers = ( SELECT COUNT(s.supplier) FROM suppliers s WHERE (categories.Category = 'A' AND s.count = 151) OR (categories.Category = 'B' AND s.count >= 0 AND s.count < 40) OR (categories.Category = 'C' AND s.count > 40.1) );
执行完这个更新后,categories表的number_of_suppliers就会被填充为对应的值。如果还要看对应供应商列表,用方案1的查询语句即可。
几个小提醒
- 假设供应商表的表名是
suppliers,如果你的实际表名不一样,记得替换成真实名称。 - SQLite的
GROUP_CONCAT默认用逗号分隔,我这里指定了,让结果更易读。 - 关于A类的条件:从你的期望结果看,A类对应count=151的供应商129,所以我写了
s.count = 151,如果你的A类实际规则有变化,调整这个条件就行。
内容的提问来源于stack exchange,提问作者aaa
相关产品推荐
相关产品推荐

