基于聚合/相等值

时间:2017-09-12 17:12:22

标签: sql sql-server loops

我有一个非常可怕的两个表数据集,我需要创建一个连接查询。最好展示一个例子:

+------+---------+-----------+--+
| 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小时开始发送的项目,所以 将被分配到小时1。
  • 50发送时间3分两批到达(分别为40和10时间4/5)。因此收到的40/10应归入时间3类
  • 在6/7收到(每个为200)与时间6中的400订单相对应(请注意,在同一时间收到订单的一半,这可能会发生)
  • 同样在时间7中,发送了新订单,其对应于在时间8收到的
  • 同样在时间9中,在同一时间内发送和接收了500个订单。

下面是输出结果的示例(请注意,还有其他值与每个“已接收”行相关联,但它们与任务正交,并且只是求和以提供含义)

    +------+----------+
    | Time | Received |
    +------+----------+
    |    1 |      100 |
    |    3 |       50 |
    |    6 |      400 |
    |    7 |      100 |
    |    8 |      100 |
    |    9 |      500 |
    +------+----------+

我一直试图绕过这一段时间。如果我可以在sql之外执行此操作,我将有一些函数循环遍历每个'Sent'的值,通过时间递增并循环通过'Received'直到值匹配然后将那些Received值分配给Time索引,然后删除两者从数组发送和接收(或注意循环到达并从那里继续)

不幸的是,该项目不允许该范围 - 这必须在SQL中尽可能多地完成。我真的很茫然,希望有一些我忽略的SQL功能。非常感谢任何帮助

1 个答案:

答案 0 :(得分: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