毫无疑问,下面的sql有错别字和bug。您可能无法仅将其粘贴并使其完美运行,但这就是我采取所有步骤的原因。解决它们,让我知道哪些不起作用以及为什么,我会尝试修复它们。
首先,试试这个只是为了获得累积数量:
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
现在让我们尝试将两个表连接在一起。我将按 sID 和日期加入,并使用 RIGHT JOIN 以便包括所有日期和价格。
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
好的,如果这很好,我们将把这两部分加在一起(累积和和连接)。我已将累积总和更改为使用 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