2014-11-22 3 views
0

У меня есть база данных SQLite выборки, в настоящее время имеет 7 записей, которые запрашиваются через:SQLite Как - Сумма по значению в РЕГИСТРИРУЙТЕСЬ

String selectQuery = "SELECT * FROM " + TABLE_TRANSACTIONS + " x " + 
        "JOIN (SELECT " + KEY_TYPE_ID + ", COUNT(*) count FROM " + TABLE_TRANSACTIONS + " GROUP BY " + KEY_TYPE_ID + " ORDER BY count DESC) y " + 
        "ON x.type_id = y.type_id " + //type_id vs. KEY_TYPE_ID as alias won't recognize KEY_TYPE_ID 
        "WHERE x.type_id = " + TagData.TYPE_EXPENSE; 

Выход есть:

Type A = 2500 
Type A = 2599 
Type B = 45000 
Type C = 299 
Type C = 2699 
Type C = 10000 
Type C = 12000 

, правильно группы мои типы по их соответствующим значениям. Тем не менее, идеальным выходом будет:

Type B = 45000 
Type C = 24998 
Type A = 5099 

где каждый тип затем упорядочивается суммой каждого типа. Это возможно? Если да, то что еще я должен делать в своем запросе? Я относительно новичок в SQL и еще не понял этого. Заранее благодарю вас за любое понимание.

EDIT

на основе вашего ввода @CL. Теперь у меня есть более простой запрос:

 String selectQuery = "SELECT *, SUM(" + KEY_AMOUNT + ") AS amount_sum " + 
         "FROM " + TABLE_TRANSACTIONS + " " + 
         "GROUP BY " + KEY_LABEL_ID + " " + 
         "ORDER BY amount_sum DESC"; 

, который работает, как ожидалось, когда я использую sqlfiddle в http://www.sqlfiddle.com/#!5/b3615/1, но не тогда, когда я использую запрос в Android. В Android возвращается только самая последняя запись для каждого типа метки. SUM, похоже, не выполняет свою работу.

Что мне здесь не хватает?

ответ

0

@CL. Ваш ответ привел меня к правильному пути, поскольку заинтересованные здесь - это результат запроса, который достиг того, что я был после:

String selectQuery = "SELECT " + KEY_LABEL_ID + ", " + " SUM(" + KEY_AMOUNT + ") as total, " + KEY_TYPE_ID + " " + 
         "FROM (" + 
            "SELECT " + KEY_LABEL_ID + ", " + KEY_AMOUNT + ", " + KEY_TYPE_ID + " " + 
            "FROM " + TABLE_TRANSACTIONS + " " + 
           ") as trans_table " + 
         "WHERE " + KEY_TYPE_ID + " = " + TagData.TYPE_EXPENSE + " " + 
         "GROUP BY " + KEY_LABEL_ID + " " +      
         "ORDER BY total DESC"; 
0

Это запрос агрегации. К счастью, SQLite поддерживает, CTE, так что вы можете сделать что-то вроде этого:

with t as (
     <your query here> 
    ) 
select type, sum(value) as sumv 
from t 
group by type 
order by sumv desc; 

Даже без оговорки with, вы могли бы просто использовать запрос в качестве подзапроса.

Вы, конечно, использовали бы соответствующие имена столбцов в запросе.

+0

Большинство андроидов не имеют версии SQLite, поддерживающей CTE. –

+0

@CL. , , Тогда OP может использовать подзапрос, как я упоминаю в ответе. –

1

Перемещение агрегации и упорядочение в подзапрос не имеет смысла.

Если вы хотите, чтобы получить количество всех сделок расходов каждого типа, просто используйте простую агрегацию:

SELECT Type_ID, 
     COUNT(*) count 
FROM TRANSACTIONS 
WHERE TYPE_IF = 'TYPE_EXPENSE' 
GROUP BY TYPE_ID 
ORDER BY count DESC 
Смежные вопросы