SQL查询动态累加和

标签 sql ms-access-2007

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

Tables

来自Tran表我知道tType = 1意味着 deposit , tType = 2意味着 buy , tType=3 表示 sell , cID是客户端 ID,sID = Stock ID SPrices 中提到的,如下表。

来自SPrices表中我感兴趣的是 sID这是 Tran 的链接, pDatelPr .

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

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/

相关文章:

javascript - 使用 WebSQL。如何向现有表添加新列?

MS-Access 2007 运行时 SendObject 崩溃

continuous-integration - 自动构建 Access 2007 数据库

sql - 为什么要避免不可重复读和幻读?

ms-access-2007 - MS Access - 删除找不到的关系

sql - JDBC 从 Access 表中选择最大值

c# - 插入 Ms Access 数据库时出错(未指定错误\r\n 对象无效或不再设置)

sql - Oracle SQL 中的日期之前

java - hibernate 问题 : must appear in the GROUP BY clause or be used in an aggregate function

python - 如何在 order_by 之后获取结果在列表中的位置?