开发者

Xcode, iphone, Sqlite, need a sign function for group by?

开发者 https://www.devze.com 2023-02-06 21:40 出处:网络
I need an sql sign function for 开发者_StackOverflow社区my group by query to group positive and negative amounts.

I need an sql sign function for 开发者_StackOverflow社区my group by query to group positive and negative amounts.

Unfortunately sqlite doesn't include one.

Can anyone suggest a workaround ? or how to ad one to work with the libsqlite3.dylib framework used in xcode ?

My query is quite complicated

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;

What I'm trying to do, is a group on sign(price) so I get two result and negative value and a positive value. These will represent total expenses and total income.

Would like to have added these tags (but I'm not allowed to create new ones libsqlite3.dylib libsqlite3)


Don't know if it's your best choice, but you can try:

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

This way, you should have 0 for ZERO or negative values and 1 for positive values.

UPDATE: If fcid is the field you need the sign for, you can try:

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;

Note that your order by clause is useless since you are grouping your results anyway.


You should just create your own sign function. See Create or Redefine SQL Functions.

Register a function using sqlite3_create_function:

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

Then implement signFunc in 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

精彩评论

暂无评论...
验证码 换一张
取 消