間違いなく、以下のSQLにはタイプミスとバグがあります。貼り付けて完全に機能させることはおそらくできないでしょうが、それが私がすべてのステップを踏んだ理由です。それらを通り抜けて、どれが機能しないのか、そしてその理由を教えてください。私はそれらを修正しようとします。
まず、累積数量を取得するためだけにこれを試してください。
SELECT Trans1.sID AS sID,
Trans1.Qty AS Qty,
(SELECT SUM(Trans2.Qty) FROM Tran AS Trans2 WHERE Trans2.tDate<=Trans1.tDate AND Trans1.sID=Trans2.sID) AS [sum]
FROM Tran AS Trans1
WHERE Trans1.sID = 584;
それは与えるべきです
sID | Qty | sum
----+-----+----
584 | 5 | 5
584 | 4 | 9
それが機能する場合は、数量をタイプ別に分類できるはずです。
SELECT Trans1.sID AS sID,
Trans1.Qty AS Qty,
Trans1.tType AS tType,
(SELECT SUM(Trans2.Qty) FROM Tran AS Trans2 WHERE Trans2.tDate<=Trans1.tDate AND Trans1.sID=Trans2.sID AND Trans2.tType=1) AS deposits,
(SELECT SUM(Trans2.Qty) FROM Tran AS Trans2 WHERE Trans2.tDate<=Trans1.tDate AND Trans1.sID=Trans2.sID AND Trans2.tType=1) AS purchases,
(SELECT SUM(Trans2.Qty) FROM Tran AS Trans2 WHERE Trans2.tDate<=Trans1.tDate AND Trans1.sID=Trans2.sID AND Trans2.tType=3) AS sales
FROM Tran AS Trans1
WHERE Trans1.sID = 584;
あなたの例では両方のトランザクションがタイプ2であるため、次のようになります。
sID | Qty | tType | deposits | purchases | sales
----+-----+-------+----------+-----------+------
584 | 5 | 2 | 0 | 5 | 0
584 | 4 | 2 | 0 | 9 | 0
それでは、2つのテーブルを結合してみましょう。sIDと日付で参加し、すべての日付と価格が含まれるようにRIGHTJOINを使用します。
SELECT SPrices.pDate AS pDate,
SPrices.sID AS sID,
Trans1.Qty AS Qty,
Trans1.tType AS tType,
SPrices.lPr AS lPr
FROM Tran AS Trans1
RIGHT JOIN SPrices ON Trans1.sID = SPrices.sID AND Trans1.tDate=SPrices.pDate
WHERE SPrices.sID = 584;
これにより、sID 584のSPricesのすべての行に行が表示され、トランザクションは適切な日にリストされ、それ以外の場合はNULL行が表示されます。
pDate | sID | Qty | tType | lPr
-----------+-----+------+-------+------
09/07/2012 | 584 | 5 | 2 | 69.99
10/07/2012 | 584 | NULL | NULL | 69.87
...
26/07/2012 | 584 | NULL | NULL | 72.40
27/07/2012 | 584 | 4 | 2 | 71.20
28/07/2012 | 584 | NULL | NULL | 72.20
さて、それが良ければ、2つの部分を足し合わせます(累積合計と結合)。SPrices.pDateを使用するように累積合計を変更しました。これは、その日にトランザクションがあるかどうかに関係なく、毎日の累積合計が必要なためです。
SELECT SPrices.pDate AS pDate,
SPrices.sID AS sID
Trans1.Qty AS Qty,
Trans1.tType AS tType,
SPrices.lPr AS lPr,
(SELECT SUM(Trans2.Qty) FROM Tran AS Trans2 WHERE Trans2.tDate<=SPrices.pDate AND SPrices.sID=Trans2.sID AND Trans2.tType=1) AS deposits,
(SELECT SUM(Trans2.Qty) FROM Tran AS Trans2 WHERE Trans2.tDate<=SPrices.pDate AND SPrices.sID=Trans2.sID AND Trans2.tType=1) AS purchases,
(SELECT SUM(Trans2.Qty) FROM Tran AS Trans2 WHERE Trans2.tDate<=SPrices.pDate AND SPrices.sID=Trans2.sID AND Trans2.tType=3) AS sales
FROM Tran AS Trans1
RIGHT JOIN SPrices ON Trans1.sID = SPrices.sID AND Trans1.tDate=SPrices.pDate
WHERE SPrices.sID = 584;
pDate | sID | Qty | tType | lPr | deposits | purchases | sales
-----------+-----+------+-------+-------+----------+-----------+------
09/07/2012 | 584 | 5 | 2 | 69.99 | 0 | 5 | 0
10/07/2012 | 584 | NULL | NULL | 69.87 | 0 | 5 | 0
...
26/07/2012 | 584 | NULL | NULL | 72.40 | 0 | 5 | 0
27/07/2012 | 584 | 4 | 2 | 71.20 | 0 | 9 | 0
28/07/2012 | 584 | NULL | NULL | 72.20 | 0 | 9 | 0
最後に、値の計算を行うために、すべてを別の選択でラップします。また、実際には必要のない列も削除します。
SELECT
pDate,
sID,
lPr,
deposits,
purchases,
sales,
lPr * (IFNULL(deposits, 0) + IFNULL(purchases,0) - IFNULL(sales,0)) AS [Value]
FROM (
SELECT SPrices.pDate AS pDate,
SPrices.sID AS sID,
SPrices.lPr AS lPr,
(SELECT SUM(Trans2.Qty) FROM Tran AS Trans2 WHERE Trans2.tDate<=SPrices.pDate AND SPrices.sID=Trans2.sID AND Trans2.tType=1) AS deposits,
(SELECT SUM(Trans2.Qty) FROM Tran AS Trans2 WHERE Trans2.tDate<=SPrices.pDate AND SPrices.sID=Trans2.sID AND Trans2.tType=1) AS purchases,
(SELECT SUM(Trans2.Qty) FROM Tran AS Trans2 WHERE Trans2.tDate<=SPrices.pDate AND SPrices.sID=Trans2.sID AND Trans2.tType=3) AS sales
FROM Tran AS Trans1
RIGHT JOIN SPrices ON Trans1.sID = SPrices.sID AND Trans1.tDate=SPrices.pDate
WHERE SPrices.sID = 584
) AS t;
最終結果は次のとおりです。
pDate | sID | lPr | deposits | purchases | sales | Value
-----------+-----+-------+----------+-----------+-------+------
09/07/2012 | 584 | 69.99 | 0 | 5 | 0 | 349.95
10/07/2012 | 584 | 69.87 | 0 | 5 | 0 | 349.34
...
26/07/2012 | 584 | 72.40 | 0 | 5 | 0 | 362.00
27/07/2012 | 584 | 71.20 | 0 | 9 | 0 | 640.80
28/07/2012 | 584 | 72.20 | 0 | 9 | 0 | 649.80