我有以下两个表,名为 Tran
和SPrices
:
来自Tran
表我知道tType = 1
意味着 deposit
, tType = 2
意味着 buy
, tType=3 表示 sell
, cID
是客户端 ID,sID = Stock ID
SPrices
中提到的,如下表。
来自SPrices
表中我感兴趣的是 sID
这是 Tran
的链接, pDate
和lPr
.
我试图看看是否可以构建一个给出如下输出的查询。
CID pDate sID Qty lPr Value
1004 09/07/2012 584 5 69.99 (69.99 * 5)
1004 10/07/2012 584 5 69.87 (69.87 * 5)
...
...
1004 26/07/2012 584 5 72.4 (72.4 * 5)
1004 27/07/2012 584 9 71.2 (71.2 * 9)
1004 28/07/2012 584 9 72.2 (72.2 * 9)
感谢您的帮助。
谢谢
最佳答案
毫无疑问,下面的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
关于SQL查询动态累加和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12540841/