2016-05-16 7 views
-2

私のデータベースの取引テーブルで、未稼働日の期首残高と期末残高を取得する方法についてのヘルプが必要です。休業日の開始残高と終了残高

トランザクションテーブル

+------------------+----------+-----------+ 
| id | trans_date | debit | credit | 
+----+-------------+----------+-----------+ 
| 1 | 2016-05-09 | 200.00 | 0.00 | 
| 2 | 2016-05-11 | 0.00 | 50.00 | 
+---------------+-------------+-----------+ 

以下のような結果が欲しいです。あなたは "2016-05-10"に取引がないことに気づくでしょうが、結果は期首残高と期末残高の両方を示しています。ありがとう

+-------------+--------------+-----------+-----------+------------+ 
| trans_date | open_bal  | debit  | credit |closing_bal | 
+-------------+--------------+-----------+-----------+------------+ 
| 2016-05-09 |   0.00 | 200.00 | 0.00 | 200.00  | 
| 2016-05-10 |  200.00 |  0.00 | 0.00 | 200.00  | 
| 2016-05-11 |  200.00 |  0.00 | 50.00 | 150.00  | 
+-------------+-------------+--------------+------------+---------+ 

私はこれを試しましたが、 "2016-05-10"は結果に表示されません。

+2

よろしくお願いいたします。あなたが聞く前に、少なくとも何かを試してみてください。 – user3791372

+0

あなたのアプリケーションレベルのコードに欠けている日付のロジックを処理するだけです – Strawberry

答えて

0

これを使用して、MySQLの日付のリストを選択できます。

SELECT DATE_ADD(CURDATE() , INTERVAL -(a.n + 10 * b.n + 100 * c.n) DAY) AS `date` 
FROM (SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) AS a 
    CROSS JOIN (SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) AS b 
    CROSS JOIN (SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) AS c 

あなたは結果に含めたい場合は、テーブルtransactionsで発表されていない日付、999過去日間の現在の日付を選択すること、LEFT JOIN

SELECT * FROM 
    (SELECT DATE_ADD(CURDATE() , INTERVAL -(a.n + 10 * b.n + 100 * c.n) DAY) AS `date` 
    FROM (SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) AS a 
     CROSS JOIN (SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) AS b 
     CROSS JOIN (SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 0) AS c 
) AS dates 
    LEFT JOIN transactions ON trans_date = dates.date 

注意して行うことができます。もっと前の日が必要な場合は、別のCROSS JOINを追加して9 999日を返します。