【发布时间】:2023-03-20 00:55:02
【问题描述】:
我正在尝试使用 SQLite 的 count() 函数来计算商店库存中每个不同商品的商品数量。
我首先创建了一个“库存”表,其中每一行代表不同的商店位置。
店面表:
db.execSQL("CREATE TABLE IF NOT EXISTS stores (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"timestamp DATETIME DEFAULT CURRENT_TIMESTAMP " +
//many other columns (eg. address, state, phone...)
");");
然后我创建了一个表,其中包含_store_id 基本上指向“商店”表中的主键的所有项目的列表。
商品条码扫描信息表:
db.execSQL("CREATE TABLE IF NOT EXISTS item_scans (" +
"_id INTEGER PRIMARY KEY AUTOINCREMENT, " +
"_store_id INTEGER," +
"item_code VARCHAR " +
");");
尝试检索特定商店的库存信息:
首先,我尝试了一个简单的查询来获取已扫描的与特定店面相关的所有商品的列表(变量sid 用于选择商店的主键)
查询:
Cursor cursor = db.rawQuery("SELECT _store_id, item_code " +
" FROM item_inventory" +
" WHERE _store_id = " + String.valueOf(sid),
null);
这会产生返回所有项目(包括重复项)的结果。
结果:
0 {
_store_id=14
item_code=852874006301
}
1 {
_store_id=14
item_code=852874006301
}
2 {
_store_id=14
item_code=041570110461
}
然后我尝试计算每个项目的出现次数并返回仅包含不同 item_code 行的结果,但我还包括一个名为 item_inventory 的新列,该列的计数应为对于给定的sid,存在多少相同的item_code 条目。
查询:
Cursor cursor = db.rawQuery("SELECT DISTINCT t1._store_id, t1.item_code, t2.item_quantity " +
" FROM item_invnetory t1 " +
" INNER JOIN (SELECT _store_id, item_code, count(item_code) AS item_quantity " +
" FROM item_inventory" +
" WHERE _store_id = " + String.valueOf(sid) +
") t2 " +
" ON t1._store_id = t2._store_id " +
" WHERE t1._store_id = " + String.valueOf(sid),
null);
这给了我一个不同项目的列表,但 item_inventory 的值不正确,看起来好像它正在计算特定商店的所有项目的总数:
结果:
0 {
_store_id=14
item_code=041570110461
item_quantity=3
}
1 {
_store_id=14
item_code=852874006301
item_quantity=3
}
我真正希望实现的是使用 SQLite 查询,其中item_inventory 是商店位置每个不同商品的商品总数的值。
期望结果示例:
0 {
_store_id=14
item_code=041570110461
item_quantity=1
}
1 {
_store_id=14
item_code=852874006301
item_quantity=2
}
对于我缺乏使用 SQLite 的经验,我深表歉意,我不经常使用 inner join 和/或 distinct,通常我也不会使用很多原始查询,但我的老板让我使用 Android 创建一个项目并在 ListView 中显示所有内容。
【问题讨论】:
-
为什么是 MySQL 标签?请提供可产生所需输出的原始样本数据。 (另见How to format SQL tables in a Stack Overflow post?)
-
MySQL 标签上的错字!感谢您指出了这一点。也感谢关于 SQL 表格式的提示!!