【问题标题】:Column that is dependent on a subquery that is dependent on another column in SQL依赖于 SQL 中另一列的子查询的列
【发布时间】:2017-03-04 20:42:52
【问题描述】:

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

我以为我已经习惯了它背后的逻辑,但后来我遇到的错误让我大吃一惊。因此,您可能会在 SO 上看到我提出的一系列问题。哈哈。

无论如何,简而言之,这就是我所拥有的:

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

我有一个查询 (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)来确定 Qty 在什么“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 的了解不足以完成这项工作。尝试学习新知识并以高质量水平应用它真的很棘手。

如果有人可以帮助我解决我的问题的任何部分,我将不胜感激。我非常擅长将来自不同解决方案的东西拼凑在一起。所以我会接受任何建议。

【问题讨论】:

  • 第二季度的查询需要的是运行总计,选择sum(Qty) over (partition by id order by youroderingcriteria) 等于或大于的第一行

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


【解决方案1】:

您似乎想要查找 Q2 的运行总数量大于 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

【讨论】:

  • 很抱歉没有将其标记为已回答。我不确定为什么。你的回答在当时确实帮助了我很多。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-17
  • 1970-01-01
  • 1970-01-01
  • 2019-11-05
  • 2016-12-28
  • 1970-01-01
相关资源
最近更新 更多