Xcode, iphone, Sqlite, нужна функция знака для группировки по? - PullRequest
2 голосов
/ 25 января 2011

Мне нужна функция sql sign для моей группы по запросу для группировки положительных и отрицательных сумм.

К сожалению, в sqlite его нет.

Может кто-нибудь предложить обходной путь? или как объявить один для работы с фреймворком libsqlite3.dylib, используемым в xcode?

Мой запрос довольно сложный

select fcid, sum(price), (select sum(price) from tmp b where ((b.due < a.due) 
or ((b.due = a.due) and (b.pid <= a.pid)))) as accumulated_price from tmp a 
where due >= '2011-01-25' and due < '2011-02-24' and price <> 0 group by fcid 
order by due, pid;

То, что я пытаюсь сделать, это группа на sign(price), поэтому я получаю два результата и отрицательное значение и положительное значение. Они будут представлять общие расходы и общий доход.

Хотелось бы добавить эти теги (но мне не разрешено создавать новые libsqlite3.dylib libsqlite3)

Ответы [ 2 ]

0 голосов
/ 25 января 2011

Вы должны просто создать свою собственную функцию знака. См. Создание или переопределение функций SQL .

Зарегистрировать функцию, используя sqlite3_create_function:

sqlite3_create_function( db, "sign", 1, SQLITE_ANY, NULL, signFunc,
                         NULL, NULL);

Затем реализуйте signFunc в C.

static void signFunc(sqlite3_context *c, int argCount, sqlite3_value **args) {
    if ( argCount != 1 ) {
        sqlite3_result_null( c );
        return;
    }

    switch ( sqlite3_value_type( args[0] ) ) {
        case SQLITE_INTEGER: {
            sqlite3_int64 asInt = sqlite3_value_int64( args[0] );
            sqlite3_int64 sign = asInt < 0 ? -1 : (asInt > 0 ? 1 : 0);
            sqlite3_result_int64( c, sign );
            break;
        }
        case SQLITE_FLOAT: {
            double asDouble = sqlite3_value_double( args[0] );
            sqlite3_int64 sign = asDouble < 0 ? -1 : (asDouble > 0 ? 1 : 0);
            sqlite3_result_double( c, sign );
            break;
        }
        case SQLITE_NULL:
        default: {
            sqlite3_result_null( c );
            break;
        }
    }
}
0 голосов
/ 25 января 2011

Не знаю, если это ваш лучший выбор, но вы можете попробовать:

select your_val > 0, sum(aggregated_value)
  from your_table
 group by your_val > 0;

Таким образом, вы должны иметь 0 для нулей или отрицательных значений и 1 для положительных значений.

ОБНОВЛЕНИЕ: Если fcid - это поле, для которого вам нужен знак, вы можете попробовать:

select fcid > 0, sum(price), 
       (
         select sum(price) 
           from tmp b
          where ((b.due < a.due) or ((b.due = a.due) and (b.pid <= a.pid)))
       ) as accumulated_price 
  from tmp a 
 where due >= '2011-01-25' 
   and due < '2011-02-24' 
   and price <> 0 
 group by fcid > 0;

Обратите внимание, что ваше предложение order by бесполезно, так как вы все равно группируете свои результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...