我需要通过查询对我的组执行sql sign
函数以对正数和负数进行分组。
不幸的是,sqlite不包含一个。
有人可以建议一个解决方法吗?或者如何使用xcode中使用的libsqlite3.dylib框架进行广告?
我的查询非常复杂
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)
答案 0 :(得分:0)
不知道这是否是您的最佳选择,但您可以尝试:
select your_val > 0, sum(aggregated_value)
from your_table
group by your_val > 0;
这样,您应该{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;
子句无用,因为您无论如何都要对结果进行分组。
答案 1 :(得分:0)
您应该创建自己的签名功能。请参阅Create or Redefine SQL Functions。
使用sqlite3_create_function
注册一项功能:
sqlite3_create_function( db, "sign", 1, SQLITE_ANY, NULL, signFunc,
NULL, NULL);
然后在C中实现signFunc。
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;
}
}
}