SQLite запрос агрегации - PullRequest
       5

SQLite запрос агрегации

0 голосов
/ 06 декабря 2018

У меня есть одна таблица мобильных телефонов с колонками

  • id
  • имя_бренда
  • имя_класса
  • состояние

Пример таблицы:

id    brand_name model_name condition sell_status
1       Apple        6s       New      unsold
2       Apple        6s       Used     unsold
3       Apple        6s       New      unsold
4       Apple        5s       New      sold

Я хочу, чтобы результат был похож на

     brand_name model_name Quantity New Used
       Apple        6s       3       2   1

Я пробовал это, но не получил результат «Новый» и «Использованный»:

public List<Mobile> getBrandMobileModel(String brand_name) {

    List<Mobile> mobileData = new ArrayList<Mobile>();
    String selectAllQuery = "SELECT brand_name, model_name, count(*), count(condition = ?), count(condition = ?) FROM " + Table_Mobile_Details + " WHERE brand_name = ? AND sell_status = ? GROUP BY model_name";

    SQLiteDatabase db = this.getReadableDatabase();
    Cursor cursor = db.rawQuery(selectAllQuery, new String[]{"New", "Used", brand_name, "unsold"});

    if (cursor.moveToFirst()) {
        do {

            Mobile mobile = new Mobile();

            //mobile.setId(cursor.getInt(0));
            mobile.setBrand_name(cursor.getString(1));
            mobile.setModel_name(cursor.getString(2));
            mobile.setQuantity(cursor.getString(3));
            mobile.setCondition_new(cursor.getString(4));
            mobile.setCondition_used(cursor.getString(5));

            mobileData.add(mobile);

        } while (cursor.moveToNext());
    }
    return mobileData;
}

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Вам нужно GROUP BY оба brand_name, model_name и использовать SUM с CASE, чтобы получить количество строк со значениями 'New' и 'Used'

String selectAllQuery = 
    "SELECT brand_name, model_name, " +
            "count(*) as Quantity, " + 
        "SUM(CASE WHEN condition = 'New' THEN 1 ELSE 0 END) as New, " +
        "SUM(CASE WHEN condition = 'Used' THEN 1 ELSE 0 END) as Used " +
    "FROM " + Table_Mobile_Details + " WHERE brand_name = ? AND sell_status = ? GROUP BY brand_name, model_name";

Также вам нужно 2 параметра, так:

Cursor cursor = db.rawQuery(selectAllQuery, new String[]{brand_name, "unsold"});
0 голосов
/ 06 декабря 2018

Попробуйте этот запрос

SELECT id,
       brand_name,
       model_name,
       COUNT(*) AS 'Quanity',
       COUNT(CASE WHEN condition = 'New' THEN 1 ELSE null END) AS 'New',
       COUNT(CASE WHEN condition = 'Used' THEN 1 ELSE null END) AS 'Used'
FROM mobiles
GROUP BY brand_name, model_name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...