Выберите месяц и сумму для всех дней в месяце

#java #android #sqlite

#java #Android #sqlite

Вопрос:

В моем приложении пользователи вводят записи в базу данных. Записи содержат автоматически увеличивающийся идентификатор, дату (в виде текста в формате мм-дд-гггг), количество (int) и несколько других полей.

Я пытаюсь получить все месяцы и сумму за каждый месяц. Чтобы я мог отображать их в своем приложении, например: декабрь 2010 — 90кв.м., январь 2011 — 45кв.м….

Что я делаю сейчас, так это выбираю дату по идентификатору, возрастающему пределу 1 и убывающему пределу 1, чтобы получить первую и последнюю даты в базе данных. Затем я разделяю месяцы и год и вычисляю, сколько там месяцев, затем я выполняю цикл for и заполняю массив, так что у меня есть 12-2010, 01-2011, 02-2011 … и т.д. затем еще один цикл for для запроса к базе данных суммы (количества), где дата находится между 12-01-2011 и 12-31-2011 и т.д.

Мне интересно… есть ли способ лучше?

Комментарии:

1. В идеале даты в SQLite должны храниться в формате ISO8601 (ГГГГ-ММ-ДД) для удобства использования с функциями даты.

Ответ №1:

 CREATE TABLE test (
id integer primary key, date date, quantity integer);
INSERT INTO "test" VALUES(1,'2011-01-01',5);
INSERT INTO "test" VALUES(2,'2011-02-01',13);
INSERT INTO "test" VALUES(3,'2011-02-12',14);
INSERT INTO "test" VALUES(4,'2011-03-01',133);
  

Вы можете сгруппировать по месяцам и суммировать величины следующим образом.

 select strftime('%Y-%m', date), sum(quantity) 
from test
group by strftime('%Y-%m', date);

2011-01    5
2011-02   27
2011-03  133
  

Ответ №2:

Если вы можете сузить дату до желаемой степени детализации в базе данных, то вы можете выполнить это одним запросом и повторить результаты. Это зависит от того, к какому типу поля относится ваш data столбец. VARCHAR Например, вы можете использовать SUBSTRING , чтобы выбрать нужные части (год и месяц), если это a. Если это DATETIME , вы можете сделать что-то вроде этого:

 SELECT strftime(date, '%m-%Y'), SUM(quantity)
FROM table GROUP BY strftime(date, '%m-%Y')
  

Комментарии:

1. В SQLite нет DATE_FORMAT функции. Используйте strftime('%m-%Y') .

2. @MPelletier ах, спасибо, я обновил ответ. По какой-то причине я думал о MySQL и замалчивал тег SQLite.