2017-02-23 42 views
0

Я пытаюсь использовать функцию SQLite count() для вычисления количества элементов для каждого отдельного элемента в инвентаре магазина.Как подсчитать количество повторяющихся строк, но возвращать только значения отдельных в SQLite?

Я начал с создания таблицы «инвентаря», в которой каждая строка представляет различные местоположения магазина.

Таблица витрин:

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 который должен быть кол-во количества одинаковых item_code записей для данного sid.

Запрос:

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.

+1

Почему тег MySQL? Пожалуйста, предоставьте исходные данные образца, которые приведут к желаемому результату. (Также см. [How to формат SQL-таблиц в переполнении стека post?] (Http://meta.stackexchange.com/q/96125)) –

+0

Общая опечатка на теге MySQL! Спасибо что подметил это. Также спасибо за подсказку по форматированию таблиц SQL !! – Logic1

ответ

1

Для этого используется GROUP BY clause, не нужно использовать JOIN или DISTINCT.

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

Perfect !! Спасибо огромное! Мне нравится StackOverflow – Logic1

 Смежные вопросы

  • Нет связанных вопросов^_^