依赖于依赖于SQL

时间:2017-03-04 20:42:52

标签: sql sql-server database sql-server-2008 syntax

好吧,我对SQL和数据库比较陌生。我从SQLite开始学习过去两个月左右,现在我在工作中使用MS SQL 2008。我遇到了一个理论上不应该很难的问题,但是我在SQL语法和结构上遇到了问题。

我以为我已经习惯了它背后的逻辑,但后来我得到了让我惊讶的错误。所以你可能会看到我的一系列问题。哈哈。

无论如何,这就是我的简要说明:

包含许多表和列的庞大数据库。

我有一个查询(Q1),它以这种形式提供从不同表格中获取的数据:

id | Info1 | Info2 | Info3 |... | InfoN
1  | ..... | ..... |  20   |... | .....
2  | ..... | ..... |  56   |... | .....
3  | ..... | ..... |  32   |... | .....
4  | ..... | ..... |  17   |... | .....
5  | ..... | ..... |  12   |... | .....
6  | ..... | ..... |  23   |... | .....

我想要做的是添加另一列," Date1"这取决于以下内容:从列" id"获取信息运行另一个给我数据的查询(Q2)(这里我使用id = 2的第二行):

id | Date1 | Date2 | ... | OtherinfoN | Qty 
2  | 03/25 | ..... | ... | .......... | 10
2  | 03/27 | ..... | ... | .......... | 6
2  | 03/26 | ..... | ... | .......... | 54
2  | 03/30 | ..... | ... | .......... | 2

现在,此查询的数据按列" Date2"排序。话虽如此,我想使用" Info3"来自原始表的数据(对于id = 2,它将是Info3 = 56)来计算出什么" Date1"数量是否加起来或超过此Info3数字。

说出我在说什么:

  • 我会从顶部开始看数量。
  • 10 = 56,不。
  • 然后移到下一行,10 + 6 = 56,没有。
  • 然后移动到下一行,10 + 6 + 54 = 56,是的!
  • 停下来,看看" Date1"这将是" Date1"第一列中的列。 (03/26)

所以最后的结果应该给我哪个查询3(Q3):

id | Info1 | Info2 | Info3 |... | InfoN | Date1
1  | ..... | ..... |  20   |... | ..... | .....
2  | ..... | ..... |  56   |... | ..... | 03/26
3  | ..... | ..... |  32   |... | ..... | .....
4  | ..... | ..... |  17   |... | ..... | .....
5  | ..... | ..... |  12   |... | ..... | .....
6  | ..... | ..... |  23   |... | ..... | .....

希望我能说清楚。

我认为结构看起来像这样:

SELECT (Columns from Q1), Date1 
FROM (SELECT etc from Q1) 
JOIN (SELECT etc from Q2 maybe more nested SELECT statements)

但显然我不太了解SQL,无法完成这项工作。尝试学习新东西并以高质量水平应用它是非常棘手的。

如果有人可以帮我解决问题的任何部分,我会很感激。我非常擅长从不同的解决方案中拼凑出来。所以我会接受任何建议。

1 个答案:

答案 0 :(得分:0)

看起来你想找到Q2中Qty的运行总量大于Q1的info3值的记录。

Window functions对于这种查询非常方便:

select *
from   (
          select Q1.*,
                 Q2.Date1,
                 sum( Q2.Qty ) over( partition by Q2.id order by Q2.Date1 ) as running_total
          from   Q1
                 left join
                 Q2
                 on Q1.id = Q2.id
       ) as running_total_query
 where running_total >= info3

示例SQL小提琴here