2014-10-01 3 views
0

Я следующий SQL запрос, который вычислительное сгруппированных данных по дням и дает следующий результат:Как обновить SQL-запрос для группировки данных по месяцам?

Result of the query

Теперь я хотел бы преобразовать этот SQL запрос для расчета данных, сгруппированных по месяцам, это означает, что в дате колонке должно быть:

2014-01 
2014-02 
2014-03 
... 

С суммы DIALS_CNT и других значений (смотрите пример ниже)

2014-01 | 120 | 56 | 26 | 40 

Может ли кто-нибудь сказать мне, как я могу получить сумму столбцов по значениям и группе по месяцам?

Большое спасибо за помощь.

SQL запросов:

var DIALS_CNT = "DIALS_CNT"; 
      var APPT_CNT = "APPT_CNT"; 
      var CONVERS_CNT = "CONVERS_CNT"; 
      var CANNOT_REACH_CNT = "CANNOT_REACH_CNT"; 
      var DIALED_CALLS_TABLE = "dialed_calls"; 
      var CALL_RESULT_STATE_APPT = "APPT"; 
      var CALL_RESULT_STATE_CONV_NO_APPT = "CONV_NO_APPT"; 
      var CALL_RESULT_STATE_CANNOT_REACH = "CANNOT_REACH"; 

      var DATE_FROM = $scope.dateFrom; 
      var DATE_TO = $scope.dateTo; 

      var sqlQuery = 
       "SELECT d.date AS DATE, "+ 
       "IFNULL(DIALS_CNT, 0) AS "+DIALS_CNT+", "+ 
       "IFNULL(APPT_CNT, 0) AS "+APPT_CNT+", "+ 
       "IFNULL(CONVERS_CNT, 0) AS "+CONVERS_CNT+", "+ 
       "IFNULL(CANNOT_REACH_CNT, 0) AS "+CANNOT_REACH_CNT+" "+ 
       "FROM "+ 
       "(SELECT DATE('2014-01-01', '+' || (t4.i*10000 + t3.i*1000 + t2.i*100 + t1.i*10 + t0.i) || ' days') date FROM "+ 
       "(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t0, "+ 
       "(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t1, "+ 
       "(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t2, "+ 
       "(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3, "+ 
       "(SELECT 0 i UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t4) d "+ 
       "LEFT JOIN "+ 
       "("+ 
       "SELECT substr(m.date, 1, 10) as my_date, COUNT(m.ID) AS '"+DIALS_CNT+"', "+ 
       "(SELECT COUNT(*) FROM "+DIALED_CALLS_TABLE+" subq WHERE subq.call_result = '"+CALL_RESULT_STATE_APPT+"' "+ 
       "AND substr(m.date, 1, 10) = substr(subq.DATE, 1, 10)) AS '"+APPT_CNT+"', "+ 
       " (SELECT COUNT(*) FROM "+DIALED_CALLS_TABLE+" subq WHERE subq.call_result = '"+CALL_RESULT_STATE_CONV_NO_APPT+"' "+ 
       "AND substr(m.date, 1, 10) = substr(subq.DATE, 1, 10)) AS '"+CONVERS_CNT+"', "+ 
       " (SELECT COUNT(*) FROM "+DIALED_CALLS_TABLE+" subq WHERE subq.call_result = '"+CALL_RESULT_STATE_CANNOT_REACH+"' "+ 
       "AND substr(m.date, 1, 10) = substr(subq.DATE, 1, 10)) AS '"+CANNOT_REACH_CNT+"' "+ 
       "FROM "+DIALED_CALLS_TABLE+" m "+ 
       "GROUP BY my_date "+ 
       ") t "+ 
       "ON d.date = t.my_date "+ 
       "WHERE d.date BETWEEN '"+DATE_FROM+"' AND '"+DATE_TO+"' "+ 
       "ORDER BY d.date DESC; "; 

ответ

1

Использование strftime из the SQLite Date and Time Functions.

Пример:

sqlite> .dump 
PRAGMA foreign_keys=OFF; 
BEGIN TRANSACTION; 
CREATE TABLE t (
title text, 
date datetime); 
INSERT INTO "t" VALUES('foo','2014-09-30'); 
INSERT INTO "t" VALUES('bar','2014-09-28'); 
INSERT INTO "t" VALUES('baz','2014-08-27'); 
COMMIT; 
sqlite> select strftime("%Y-%m", date) as d, 
       count(*) as c 
      from t 
     group by strftime("%Y-%m", date); 
2014-08|1 
2014-09|2 

Адаптация это ваша структуру таблицы и запрос должен быть легко.

+0

Спасибо, но в столбце d результата будет значение null вместо года и месяца, а также мне нужно вычислить значения для всех месяцев в диапазоне дат. –

+0

Необходимо легко адаптировать ваш запрос, используя 'strftime'. –

+0

Не могли бы вы добавить какой-нибудь рабочий пример, пожалуйста? У меня нет опыта с функцией strftime в SQLlite. –

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