2011-12-22 14 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」列作爲所有事務的基礎(忽略amount_due)。

任何想法?

我可以開始製作另一個只包含此信息的表的路徑,但也許有人可以想出一個可以從實際數據中做到這一點的漂亮查詢。

回答

0

這裏的我接受它。基本上你的

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

加入回發票表,以便您可以訪問昨天的AMOUNT_DUE場(我做了左連接,所以如果你問你的表的第一天,你還是會得到一個回錄)

其餘的很簡單。我不確定今天的結餘餘額是昨天+流入+流出的總和還是隻是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

對不起,最近的回覆...假期和所有的假期。 我得到這個查詢工作: '選擇 日期(todaydata.postdate)爲踵, SUM(CASE時todaydata.amount> 0,則todaydata.amount ELSE 0 END)AS流入, SUM(CASE時todaydata。金額<0 THEN todaydata.amount ELSE 0 END)作爲OUTFLOW FROM發票as todaydata LEFT JOIN作爲昨天數據發票ON todaydata.postdate = DATE_ADD(昨天數據.postdate,區間-1天) GROUP BY日期(todaydata.postdate)' 難看的格式化stackoverflow!hah – 2012-01-10 22:33:42

+0

我很難讓StartingBalance和EndingBalance正常工作。 EndingBalance相當於:startingbalance + inflow + outflow = endingbalance,StartingBalance當然會在第一行爲0,否則爲:StartingBalance = Yesterday的EndingBalance – 2012-01-10 22:37:08

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

我同意這將是最好的,但可悲的是,我不能建議將表分成兩個表。不是我的項目範圍。儘管這條道路最終可能會被採用。 – 2012-01-10 22:38:54