2011-01-25 7 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; 

非常に複雑であるので、私は2つの結果、負の値と正の値を取得sign(price)上のグループです。これらは総経費と総所得を表します。

は、これらのタグを追加したいです(しかし、私はのlibsqlite3 libsqlite3.dylib新しいものを作成することはできませんよ)

答えて

0

それはあなたの最良の選択かどうか分からないのですが、あなたは試すことができます。

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

このように、ゼロまたは負の値の場合は0、正の値の場合は1にする必要があります。

UPDATE:fcidはあなたが看板を必要とするフィールドがある場合は、試すことができます:あなたはとにかくあなたの結果をグループ化しているので、あなたのorder by句は無用である

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; 

注意を。

+0

をsignFuncを実装しますか? – xyzzycoder

+0

3番目の行があります。 sum(aggregated_value) –

+0

私の編集を参照してください、私のクエリはかなり複雑で、これらを含める方法がわかりません。 – Jules

0

あなた自身のサイン機能を作成してください。 Create or Redefine SQL Functionsを参照してください。

sqlite3_create_functionを使用して関数を登録します。

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

その後your_valが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; 
     } 
    } 
} 
関連する問題