用列中的其他值填充空白/空值
Posted
技术标签:
【中文标题】用列中的其他值填充空白/空值【英文标题】:Filling Blank/Null values with other values within a column 【发布时间】:2014-12-10 01:14:14 【问题描述】:我有一个这样设置的列:
-----Col_2-----
Value 1
Value 2
-----------------
如您所见,列中有 2 个值,但也有很多空格。我想做的是运行Update
查询,它将用 2 个值替换空白。我想要的是将列更新为如下所示:
-------Col_2---------
Value 1
Value 1
Value 1
Value 2
Value 2
value 2
---------------------
基本上,我想运行一个查询,该查询查看第一个非空值并用该非空值替换以下空值,直到它遇到下一个非空值。一旦它达到下一个非空值,它就会继续用新值替换以下空值。目前,我已经设置好了。
Update Table1,
(Select TOP 1 Col_1 AS Z FROM Table1 Where Col_1 Is Not Null)
Set Col_1 = Z
Where Col_1 Is Null;
这会将每个空值替换为第一个非空值,但一旦遇到下一个非空值就不会停止。这导致我得到这样的结果:
---------Col_2-----------
Value 1
Value 1
Value 1
Value 2
Value 1
Value 1
-------------------------
有没有办法在访问中添加某种“执行此操作直到”此语句?我知道你可以用 php 和其他语言运行 if, then 语句,但不确定如何在 access 或直接 SQL 中执行此操作。
更新:
第二列包含帐号,与COL_1
中的值相关。原来的设置是这样的。
-----Col_1-------Col_2------
12345 Value 1
12345
12345
54321 Value 2
54321
54321
------------------------------
有没有办法使用 Col_1 来让 Col_2 看起来像:
--------Col_2---------
Value 1
Value 1
Value 1
Value 2
Value 2
Value 2
----------------------
不必在查询中手动输入 Col_1 的号码?我的意思是,我不想在查询中手动输入“12345”或“54321”,而是让事情自动发生。
【问题讨论】:
你需要一个order by
的字段来查找之前的非空值。没有,你怎么知道哪个更新到Value 1
,哪个更新到Value 2
?
这就是为什么我试图找到一种更新方法,直到它达到下一个非空值。某种修改过的 SQL if then 语句,它将更新到下一个非空值,然后停止以便我可以创建另一个查询或读取该非空值并填充列的其余部分。
@sgeddes 可能想说的是:您首先需要一种告诉计算机的方法,根据什么标准您最终得到该列,以及您呈现它的方式。可能/希望这是基于一个或多个其他列。在简单的情况下,所有这些其他值对于所有行都是相同的,Col1 应该保持相同的值。如果标准值在不重叠的范围内,则应该仍然可行(即在 SQL 中)。如果实际上没有任何东西可以对它们进行排序,那么声明式解决方案是不可能的。
@Abecee 还有另一列我最初想用作标准,但我无法使其工作。第二列是与这些值匹配的帐号列表。我将更新原始帖子以反映我的意思。
@Jcmoney1010 -- col1
的相同值是否始终具有相同的 col2
值?如果是这样,很容易为此编写一个update
语句...如果存在多个值,你又回到了同样的问题,因为你没有一个列来定义要使用的值。
【参考方案1】:
假设我正确理解了您的问题,您可以使用更新语句,将表连接回自身。我认为这是 Access 中的正确语法:
update Table1
inner join Table1 t2 on Table1.col1 = t2.col1 and t2.col2 is not null
set Table1.col2 = t2.col2
SQL Fiddle Demo
【讨论】:
我在t2.col2
上收到了join expression not supported error
【参考方案2】:
一种方法:
UPDATE SomeData SDOuter
SET Col_2 = (SELECT MAX(SDInner.Col_2) FROM SomeData SDInner WHERE SDInner.Col_1 = SDOuter.Col_1 AND Col_2 IS NOT NULL)
WHERE Col_2 IS NULL;
SQL Fiddle
【讨论】:
你从哪里得到 SDOuter? hmmm 以语法错误告终。在(SELECT MAX(SDInner.Col_2) FROM SomeData SDInner WHERE SDInner.Col_1 = SDOuter.Col_1 AND Col_2 IS NOT NULL)
还有更多细节吗?小提琴正在为我演奏。不适合你吗?如果您只想检查此查询,则需要删除对外部语句的引用,如下所示:SELECT MAX(SDInner.Col_2) FROM SomeData SDInner WHERE Col_2 IS NOT NULL;
BTW:MAX
在那里以防万一,对于某些记录,Col_2 被多次指定 -但内部查询不能返回多于一行,以免整个语句失败。
... 所以内部查询的本质/基本原理是SELECT SDInner.Col_2 FROM SomeData SDInner WHERE Col_2 IS NOT NULL;
。
抱歉延迟回复。除了它是syntax error
之外,我没有更多细节。小提琴昨晚工作了,我的问题是当我试图在我的数据库上实际运行它时,那是我收到错误的时候。以上是关于用列中的其他值填充空白/空值的主要内容,如果未能解决你的问题,请参考以下文章
当必须使用同一列中的不同值填充单元格时,如何填写该列中的空白单元格?