2017-09-27 13 views
0

私は3つのテーブルを持っています。表Aは、株式とカテゴリーの関係を保管する。追加日は、在庫がカテゴリに追加された日時を示し、削除日は、在庫が削除された日を意味します。取消日がNULLの場合、在庫はまだカテゴリに含まれていることを意味します。MySql 2つのテーブルのレコードを合計し、3番目のテーブルと結合します

 +---+----------+ ------- +------------+------------+ 
     |id | Stock_id |Category | Add Date | Remove Date| 
     +---+----------+-------- +------------+------------+ 
     | 1 |  1 | CategoryA| 2017-09-03 | 2017-09-07 | 
     | 2 |  1 | CategoryA|2017-09-11 | null  | 
     | 3 |  2 | CategoryA| 2017-09-06 | null | 
     +---+----------+-------- +------------+------------+ 

表Bには、取引日数が格納されています。

+---+------------+----------+-------------+ 
    |id | Stock_id | amount | Date  | 
    +---+------------+----------+-------------+ 
    | 1 |   1 |  100 | 2017-09-04 | 
    | 2 |   1 |  100 | 2017-09-05 | 
    | 3 |   1 |  100 | 2017-09-06 | 
    | 4 |   1 |  100 | 2017-09-07 | 
    | 5 |   1 |  100 | 2017-09-08 | 
    | 6 |   1 |  100 | 2017-09-09 | 
    | 7 |   2 |  100 | 2017-09-05 | 
    | 8 |   2 |  200 | 2017-09-06 | 
    .... 
    | 2 |   2 |  200 | 2017-09-10 | 
    +---+------------+----------+-------------+ 

表Cは、カテゴリトランザクション量を日数で格納します。

+---+------------+----------+-------------+ 
    |id | Category | amount | Date  | 
    +---+------------+----------+-------------+ 
    | 1 |   A |  300 | 2017-09-04 | 
    | 2 |   A |  300 | 2017-09-05 | 
    | 3 |   A |  300 | 2017-09-06 | 
    | 4 |   A |  300 | 2017-09-07 | 
    | 5 |   A |  300 | 2017-09-08 | 
    +---+------------+----------+-------------+ 

私は何をしたいことは、このような2017年9月4日から2017年9月8日までとして、1)期間中カテゴリ量を合計し、一定の期間である、2)その後、すべての合計期間内のカテゴリにあるidによる金額の在庫。 3)2を1で割って比率を計算する。 STOCK ID1の場合、09-07で削除されたため、sqlは3日間のレコード(09-03/09.06)の金額のみを計算する必要があります。 STOCK ID2の場合は09-06に追加され、09.06から09.08までの3日間のみ計算されます。表Cのカテゴリの合計金額は単純ですが、合計はわずか5日です。 結果は期待通りです

+---+----------+ ------- + 
    |id | Stockid |Result | 
    +---+----------+-------- + 
    | 1 |  1 | 0.2  |  # (100+100+100)/300*5    
    | 2 |  2 | 0.4  |  # (200+200+200)/300*5 

どうすればいいですか?皆さん、ありがとうございました!

答えて

0

私はこのコード例を少し難解だが、ここでは試みている。これで問題が直接解決されるわけではありませんが、一般的にアプローチを適用して問題を解決できることを願います。

CREATE TABLE tableA(id INT, stockId INT, category CHAR(1), addDate DATE, removeDate DATE); 

INSERT INTO tableA VALUES 
    (1, 1, 'A', '2017-09-03', '2017-09-07'), 
    (2, 1, 'A', '2017-09-11', null), 
    (3, 2, 'A', '2017-09-06', null); 

CREATE TABLE tableB(id INT, stockId INT, amount INT, `date` DATE); 

INSERT INTO tableB VALUES 
    (1, 1, 100, '2017-09-04'), 
    (2, 1, 100, '2017-09-05'), 
    (3, 1, 100, '2017-09-06'), 
    (4, 1, 100, '2017-09-07'), 
    (5, 1, 100, '2017-09-08'), 
    (6, 1, 100, '2017-09-09'), 
    (7, 2, 100, '2017-09-05'), 
    (8, 2, 200, '2017-09-06'), 
    (9, 2, 200, '2017-09-06'), 
    (10, 2, 200, '2017-09-10'); 

CREATE TABLE tableC (id INT, category CHAR(1), amount INT, `date` DATE); 

INSERT INTO tableC VALUES 
    (1, 'A', 300, '2017-09-04'), 
    (2, 'A', 300, '2017-09-05'), 
    (3, 'A', 300, '2017-09-06'), 
    (4, 'A', 300, '2017-09-07'), 
    (5, 'A', 300, '2017-09-08'); 

SELECT table_AB.tableAB_SUM/table_B.tableB_SUM * TIMESTAMPDIFF(DAY, '2017-09-04', '2017-09-08') FROM 
    (
    SELECT tableB.stockId, SUM(tableB.amount) tableAB_SUM FROM 
     tableB 
    LEFT OUTER JOIN 
     tableA 
    ON tableB.stockId = tableA.stockId 
    WHERE tableB.`date` BETWEEN '2017-09-04' AND '2017-09-08' AND (NOT tableA.addDate > '2017-09-08' OR NOT IFNULL(tableA.removeDate, CURDATE()) < '2017-09-08') 
    GROUP BY tableA.stockId 
    ) table_AB 
LEFT OUTER JOIN 
    (
    SELECT stockId, SUM(amount) tableB_SUM FROM tableB WHERE `date` BETWEEN '2017-09-04' AND '2017-09-08' GROUP BY stockId 
    ) table_B 
ON table_AB.stockID = table_B.stockID; 

不明な点があれば教えてください。

よろしく、

ジェームズ

関連する問題