2

Tran私はと呼ばれる次の2つのテーブルを持っていますSPrices

テーブル

Tran表から、次の表で参照されているクライアントIDは、をtType = 1意味し、tType=3はを意味します。deposittType = 2buysellcIDsID = Stock IDSPrices

表から、SPrices私が興味を持っているのは、、、およびとsIDのリンクです。TranpDatelPr

以下のような出力を与えるクエリを作成できるかどうかを確認しようとしています。

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)

私はあなたの助けに感謝します。

ありがとう

4

3 に答える 3

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

それでは、2つのテーブルを結合してみましょう。sIDと日付で参加し、すべての日付と価格が含まれるようにRIGHTJOINを使用します。

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

さて、それが良ければ、2つの部分を足し合わせます(累積合計と結合)。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
于 2012-09-22T05:14:04.847 に答える
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 = ?

を適切なトランザクションタイプに置き換えます?(必要な場合)。

于 2012-09-22T05:17:46.573 に答える
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;
于 2012-09-29T03:51:37.740 に答える