2017-09-12 18 views
0

私は非常にという2つのテーブルのデータセットを作成しています。その例として示すために最善:集計/等価値に基づくSQLテーブルの結合

+------+---------+-----------+--+ 
| Time | Sent | Received | | 
+------+---------+-----------+--+ 
| 1 | 100  | NULL  | | 
| 2 | NULL | 100  | | 
| 3 | 50  | NULL  | | 
| 4 | NULL | 40  | | 
| 5 | NULL | 10  | | 
| 6 | 400  | 200  | | 
| 7 | 100  | 200  | | 
| 8 | NULL | 100  | | 
| 9 | 500  | 500  | | 
+------+---------+-----------+--+ 

と仮定すると、「時間」以上の時間であるが - 「送信」は時間で送信されたアイテムの数を示し、「受信」受信数が表示されます。問題は、送信された同じ時間に到着しない可能性が高いことです(ただし、です)。

私は受信したアイテムと一致する必要がありますに受信したアイテムが送信されたに送信された適切な送信されたと一致する必要があります。上記を使用

  • は時刻2に100を受信明らか時間1から送信されたアイテムであり、時間3で送信1.
  • 50時間に割り当てられるように 二つのバッチに到着(それぞれ時間4/5で40と10)。受領した40/10は、時間3のカテゴリーにまとめられるべきである。
  • 6/7で受信された(それぞれ200)は、時間6の400オーダーに対応する(半時間が同じ時間に受信されたことに注意する。 )
  • また、時間7には、受信された時間に対応する新しいオーダーが送信された。
  • また、時間9では、500時間のオーダーが同じ時間に送受信された。以下は

出力は

(そこに各「受信」の行に関連する他の値であるが、それらはタスクに直交しているだけの意味を提供するために合算されることに注意してください)どのように見えるかの例です。
+------+----------+ 
    | Time | Received | 
    +------+----------+ 
    | 1 |  100 | 
    | 3 |  50 | 
    | 6 |  400 | 
    | 7 |  100 | 
    | 8 |  100 | 
    | 9 |  500 | 
    +------+----------+ 

私はしばらくこの周りに頭を抱えようとしています。私はSQLの外でこれを行うことができた場合、私はいくつかの機能を持って、各 'Sent'の値を徐々にループし、 'Received'を通して値が一致するまで受信した値をTimeインデックスに割り当て、配列からの送受信(またはループがそこに到達してそこからどこに行くのかをメモしてください)

残念ながら、このプロジェクトはそのスコープを許可しません。これはできるだけSQLで行う必要があります。私は本当に失われており、見過ごしてしまったいくつかのSQL機能があることを願っています。任意のヘルプが大いに評価されています

+3

1.希望の出力に「9 400」と「9 500」がないのはなぜですか? –

+0

2.希望の出力は、 'SELECT時間、受信したASから送信された送信されたもの 'とはどのように異なっていますか?私は、あなたが送ったり受信したマッチングについてあなたが言っていることを理解していますが、あなたの出力はそれを実際に示していません。 –

+0

@RossPresser間違った時間をもたらすと思います。 – Xedni

答えて

1

これがSQL Serverの場合、WHILEループを使用できます。 documentationを見てください。したがって、あなたのプロジェクトは次のようになります:

CREATE TABLE #temp ([Time] int, [Received] int) 
DECLARE @i int = 1 
DECLARE @value int = 0 
WHILE @i <= 9 
BEGIN 
    @value = SELECT [Received] FROM [table] WHERE [Time] = @i 
    --Your logic here 
    INSERT INTO #temp ... 
END 
SELECT * FROM #temp 
DROP TABLE #temp 
+0

これはうまくいくかもしれません!私はSQLがこのようなループ機能を持っていたことに気付かなかった。私は何かを働かせることができると思う。 – AMcNall

+0

私はテーブル値をループすることができるように見えるので、それは将来の方法かもしれない。ありがとうございます – AMcNall

+1

私は可能な限りループを使用しないことをお勧めします。 – zambonee

関連する問題