2011-01-25 39 views
2

我需要一個sql sign函數爲我的小組通過查詢分組正面和負面的金額。Xcode,iPhone,Sqlite,需要一個標誌功能爲組?

不幸的是,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

不知道如果這是你最好的選擇,但你可以嘗試:

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

這樣,您應該有0 ZERO或負值和1正值。

UPDATE:如果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子句是無用的,因爲你是無論如何分組結果。

+0

實施signFunc如何行,其中your_val是NULL來在此查詢評估? – xyzzycoder 2011-01-25 17:32:42

0

您應該創建自己的標誌功能。請參閱Create or Redefine SQL Functions

註冊使用sqlite3_create_function功能:

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

然後在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; 
     } 
    } 
}