我有以下两个名为Tran
和SPrices
的表:
从Tran
表我知道tType = 1
表示deposit
,tType = 2
表示buy
,tType = 3表示sell
,{{ 1}}是客户ID,cID
,在下面的sID = Stock ID
中引用。
从SPrices
表中我感兴趣的是,SPrices
这是与sID
,Tran
和pDate
的链接。
我试图看看我是否可以构建一个提供如下输出的查询。
lPr
感谢您的帮助。
由于
答案 0 :(得分:3)
毫无疑问,下面的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
现在让我们尝试将两个表连接在一起。我将通过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
答案 1 :(得分:0)
这应该有所帮助。
SELECT
Tran.cID,
sPrices.pDate,
Tran.sID,
Tran.Qty,
sPrices.lPr,
Tran.Qty * sPrices.lPr AS Value
FROM
Tran INNER JOIN SPrices
ON
Tran.sID = SPrices.sID
WHERE
Trans.tType = ?
将?
替换为正确的交易类型(如果需要)。
答案 2 :(得分:0)
最终查询给出了期望的结果......为了实现这一点,所有的功劳都归功于jmilloy ..
SELECT
pDate,
sID,
lPr,
deposits,
purchases,
sales,
BalQty,
lPr * BalQty 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=2) 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,
(SELECT SUM(Trans2.Qty) FROM Tran AS Trans2 WHERE Trans2.tDate<=SPrices.pDate AND SPrices.sID=Trans2.sID ) AS BalQty
FROM Tran AS Trans1
RIGHT JOIN SPrices ON Trans1.sID = SPrices.sID AND Trans1.tDate=SPrices.pDate
WHERE SPrices.sID = 584
) AS t;