SQL查询动态累积和

时间:2012-09-22 04:56:46

标签: sql ms-access-2007

我有以下两个名为TranSPrices的表:

Tables

Tran表我知道tType = 1表示deposittType = 2表示buy,tType = 3表示sell,{{ 1}}是客户ID,cID,在下面的sID = Stock ID中引用。

SPrices表中我感兴趣的是,SPrices这是与sIDTranpDate的链接。

我试图看看我是否可以构建一个提供如下输出的查询。

lPr

感谢您的帮助。

由于

3 个答案:

答案 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;
相关问题