【问题标题】:How to count the number of duplicate rows but return only the values of distinct in SQLite?如何计算重复行的数量但只返回 SQLite 中不同的值?
【发布时间】: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 中显示所有内容。

【问题讨论】:

标签: android sqlite


【解决方案1】:

您为此使用GROUP BY clause,无需使用JOIN 或DISTINCT。

SELECT item_code, COUNT(*) as item_quantity
FROM item_inventory
WHERE _store_id = ?
GROUP BY item_code

【讨论】:

  • 完美!!太感谢了!我喜欢 StackOverflow
【解决方案2】:

我已经使用下面的代码解决了同样的问题:

String query = "SELECT violationDate, COUNT(*) as date " +
            "FROM challan " +
            "WHERE challanType = '" + type + "' GROUP BY violationDate";

这里的violationDate 和date 是结果表的两列。日期列将返回发生。

cr.getInt(1)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多