如何基于多个检查复制值,并使用SQL填充同一表中其他行的值

时间:2017-05-29 16:02:48

标签: sql sql-server

抱歉以不正当的方式构建问题,但我想在下面澄清我的问题的逻辑。希望它有助于理解我的问题

如果我将下表作为样本数据:

+-----+-----------+------+
|  a  |     b     |  c   |
+-----+-----------+------+
| 100 | Apple     | NULL |
| 100 | Orange    | 1.05 |
| 101 | Apple     | NULL |
| 102 | Apple     | NULL |
| 102 | Dont care | NULL |
| 103 | Apple     | NULL |
| 103 | Dont care | NULL |
| 103 | Orange    | 1.01 |
+-----+-----------+------+

现在我想填充列C的值,其中列B = Apple为NULL。该值将取自相同列A值的列B =橙色。

如果对于列A的给定的不同值,我们有列B = Apple但不具有列B =橙色,那么列C的值(对于列A和列B的给定的不同值) = Apple)应填充C列的值(对于列A的下一个不同的升序值,列B =橙色)。

所以我的输出应该是这样的:

+-----+-----------+------+
|  a  |     b     |  c   |
+-----+-----------+------+
| 100 | Apple     | 1.05 |
| 100 | Orange    | 1.05 |
| 101 | Apple     | 1.01 |
| 102 | Apple     | 1.01 |
| 102 | Dont care | NULL |
| 103 | Apple     | 1.01 |
| 103 | Dont care | NULL |
| 103 | Orange    | 1.01 |
+-----+-----------+------+

由于

1 个答案:

答案 0 :(得分:1)

您可以使用outer apply执行此操作。

select t1.a,t1.b
,case when t1.b='Apple' and t1.c is null then t2.new_c else c end as new_c
from tbl t1
outer apply (select top 1 c as new_c 
             from tbl t2 where t2.a>=t1.a and t2.b='Orange' 
             order by a) t2