2011-12-22 8 views
2

まず、私のテーブル:MySQLは請求書に基づいて毎日の流入/流出を取得しますか?

mysql> desc invoice; 
+-------------+-----------------------+------+-----+---------+----------------+ 
| Field  | Type     | Null | Key | Default | Extra   | 
+-------------+-----------------------+------+-----+---------+----------------+ 
| id   | int(11)    | NO | PRI | NULL | auto_increment | 
| date  | timestamp    | YES |  | NULL |    | 
| sent  | timestamp    | YES |  | NULL |    | 
| due_date | timestamp    | YES |  | NULL |    | 
| amount  | float     | YES |  | NULL |    | 
| amount_due | float     | YES |  | NULL |    | 
| status  | enum('unpaid','paid') | YES |  | NULL |    | 
| customer_id | int(11)    | NO | MUL | NULL |    | 
+-------------+-----------------------+------+-----+---------+----------------+ 
8 rows in set (0.00 sec) 

誰も私が行ごとに、返されたクエリを考え出すのに役立ちます。

日(そのグループをDUE_DATEにより) 日の開始残高 流入(日について陽性トランザクションの合計) 流出(昼用負トランザクションの合計) 残高(後に終日の残高(これは、前日の終了バランスであろう)流入と流出の取引が適用されている)

基本的に私は撤回されたどのくらいのお金、堆積したどのくらいのお金を知りたい毎日、その日のバランスがで開始し、期末残高。

また、当日は「due_date」で行をグループ化し、amount_dueを無視してすべてのトランザクションの基礎として「金額」列を使用するように指定する必要があります。

アイデア?

私はこの情報を保持しているが、おそらく誰かが実際のデータオフこれを行うことができます気の利いたクエリを考え出すことができると思った別のテーブルを作る道を下る開始することができます。

答えて

0

ここです私はそれを取る。基本的には、(私は左があなたの表の最初の日を求めるならば、あなたはまだ戻ってレコードを取得しますので、参加しなかったので、あなたは昨日のAMOUNT_DUEフィールドへのアクセス権を持っている

todaydata.due_date=DATE_ADD(yesterdaydata.due_date,DAY,-1) 

バック請求書テーブルに参加します)

残りの部分は非常に簡単です。私はそれがtodaydata.amount_dueのちょうど合計した場合、今日の期末残高は、昨日+流入+流出や和だったかどうかわからなかったので、私は両方を含みます。

SELECT 
todaydata.due_date, 
SUM(case when yesterdaydata.amount_due is null then 0 else yesterdaydata.amount_due end)) AS StartingBalance, 
SUM(CASE when todaydata.amount > 0 THEN todaydata.amount ELSE 0 END) AS INFLOW, 
SUM(CASE when todaydata.amount < 0 THEN todaydata.amount ELSE 0 END) AS OUTFLOW, 
SUM(yesterday.amount_due) AS StartingBalance + 
      SUM(CASE where todaydata.amount > 0 THEN todaydata.amount ELSE 0 END) + 
      SUM(CASE where todaydata.amount < 0 THEN todaydata.amount ELSE 0 END) AS CalculatedEndingBalance, 
SUM(todaydata.amount_due) AS OtherEndingBalance 
FROM invoice [todaydata] 
LEFT JOIN invoice [yesterdaydata] ON todaydata.due_date=DATE_ADD(yesterdaydata.due_date,DAY,-1) 
GROUP BY todaydata.due_date 

私はそう私は構文エラーを知っていると私は訂正しますMySQLのデータベースに対してこれをテストする能力を持っていませんでした。

+0

遅く返事を申し訳ありません...休暇の休暇とすべて。 私はこのクエリが動作するようになった: は 'POSTDATEとして 日(todaydata.postdate)、流入AS、 SUM(CASE todaydata SUM(todaydata.amount> 0 THEN todaydata.amount ELSE 0 END CASE)を選択します。 (今日のデータ。金額ELSE 0終了)OUTLOW 今日のデータからの請求書 LEFT JOINの請求書は昨日のデータから今日の日付のデータ.postdate = DATE_ADD(昨日のデータ。ポスト日付、間隔-1日) GROUP BY日付(今日のデータポスト日付) ' 醜いの書式設定のstackoverflow!hah –

+0

私はStartingBalanceとEndingBalanceを動作させるのに苦労しています。 EndingBalanceは次のものと同じです:startingbalance + inflow + outflow = endingbalanceそしてStartingBalanceはもちろん最初の行では0になります。それ以外の場合はStartingBalance = Yesterday's EndingBalance –

0

あなたはそうのようなあなたの請求書テーブルからあなたのトランザクションを分割する必要があります:あなたは、トランザクションテーブルを作成して行われ

TABLE invoice (
    id int autoincrement, 
    due_date date, 
    customer_id int, 
    sent_date date 
); 

TABLE transaction (
    id int autoincrement primary key 
    transaction_date date, 
    amount double, 
    transaction_type enum ("charge", "payment"), 
    customer_id int 
); 

した後、あなたは簡単で、あなたが必要なものを得ることができます。

SELECT SUM(amount), transaction_type, transaction_date, customer_id FROM transaction GROUP BY customer_id, transaction_date, transaction_type 
+0

これは最高ですが悲しいことに私は同意します。テーブルを2つのテーブルに分割することはお勧めできません。私のプロジェクトの範囲ではありません。この経路は最終的には取られるかもしれないが。 –

関連する問題