Sql server 2008 SQL Server 2008查询以填充空值
我需要一个关于下表的问题 桌子Sql server 2008 SQL Server 2008查询以填充空值,sql-server-2008,Sql Server 2008,我需要一个关于下表的问题 桌子 ClienName Bal0 Bal1 Bal2 Bal3 Bal4 Bal5 Bal6 -------------------------------------------------------------------------------- A 600 600 NULL NULL NULL NULL
ClienName Bal0 Bal1 Bal2 Bal3 Bal4 Bal5 Bal6
--------------------------------------------------------------------------------
A 600 600 NULL NULL NULL NULL NULL
B Null 100 NULL NULL NULL NULL NULL
C NULL NULL 200 NULL NULL NULL NULL
D NULL NULL NULL NULL NULL 130 130
E 510 510 NULL 510 510 NULL NULL
F 170 170 NULL 170 170 NULL 170
G 210 210 NULL 210 210 210 210
H 20 20 NULL 20 NULL NULL NULL
结果:我想查看下表,哪个查询可以完成?请帮忙
ClienName Bal0 Bal1 Bal2 Bal3 Bal4 Bal5 Bal6
--------------------------------------------------------------------------------
A 600 600 600 600 600 600 600
B 100 100 100 100 100 100 100
C 200 200 200 200 200 200 200
D 130 130 130 130 130 130 130
E 510 510 510 510 510 510 510
F 170 170 170 170 170 170 170
G 210 210 210 210 210 210 210
H 20 20 20 20 20 20 20
假设我从非常有限的示例集中了解了您想要的内容,只需浏览表格并逐列填充即可 前进方向一次:
UPDATE theTable
SET Bal1 = Bal0
WHERE Bal1 IS NULL AND Bal0 IS NOT NULL;
UPDATE theTable
SET Bal2 = Bal1
WHERE Bal2 IS NULL AND Bal1 IS NOT NULL;
...
还有一个相反的过程:
UPDATE theTable
SET Bal5 = Bal6
WHERE Bal5 IS NULL AND Bal6 IS NOT NULL;
UPDATE theTable
SET Bal4 = Bal5
WHERE Bal4 IS NULL AND Bal5 IS NOT NULL;
...
这也(假设“Bal”意味着平衡,并且数字与时间有关)处理列中的值随着时间的增加而不同的情况
如果只需要第一个非空列,请尝试
COALESCE
运算符:
SELECT ClienName, COALESCE(Bal0, Bal1, Bal2, Bal3, Bal4, Bal5, Bal6) AS firstBal
FROM theTable
假设我从非常有限的示例集中了解了您想要的内容,只需浏览表格并逐列填充即可 前进方向一次:
UPDATE theTable
SET Bal1 = Bal0
WHERE Bal1 IS NULL AND Bal0 IS NOT NULL;
UPDATE theTable
SET Bal2 = Bal1
WHERE Bal2 IS NULL AND Bal1 IS NOT NULL;
...
还有一个相反的过程:
UPDATE theTable
SET Bal5 = Bal6
WHERE Bal5 IS NULL AND Bal6 IS NOT NULL;
UPDATE theTable
SET Bal4 = Bal5
WHERE Bal4 IS NULL AND Bal5 IS NOT NULL;
...
这也(假设“Bal”意味着平衡,并且数字与时间有关)处理列中的值随着时间的增加而不同的情况
如果只需要第一个非空列,请尝试
COALESCE
运算符:
SELECT ClienName, COALESCE(Bal0, Bal1, Bal2, Bal3, Bal4, Bal5, Bal6) AS firstBal
FROM theTable
如果您只想查询max(假设每行只有一个值),而不想更新现有表,那么您可以这样做
declare @table table(clientname varchar(5), bal0 int,
bal1 int, bal2 int, bal3 int, bal4 int, bal5 int, bal6 int)
insert into @table
select 'A', 600, 600, null, 600, 600, null, null
UNION ALL
select 'B', null, 120, null, null, 120, null, null
;with cte as (
select clientname, (SELECT MAX(val)
FROM (VALUES (bal0),(bal1),(bal2),(bal3),
(bal4),(bal5),(bal6)) AS value(val)) As mCOL
from @table
)
select t.clientname, mCOL as bal0, mCOL as bal1, mCOL as bal2, mCOL as bal3,
mCOL as bal4, mCOL as bal5, mCOL as bal6
from @table t inner join cte c on t.clientname = c.clientname
如果您只想查询max(假设每行只有一个值),而不想更新现有表,那么您可以这样做
declare @table table(clientname varchar(5), bal0 int,
bal1 int, bal2 int, bal3 int, bal4 int, bal5 int, bal6 int)
insert into @table
select 'A', 600, 600, null, 600, 600, null, null
UNION ALL
select 'B', null, 120, null, null, 120, null, null
;with cte as (
select clientname, (SELECT MAX(val)
FROM (VALUES (bal0),(bal1),(bal2),(bal3),
(bal4),(bal5),(bal6)) AS value(val)) As mCOL
from @table
)
select t.clientname, mCOL as bal0, mCOL as bal1, mCOL as bal2, mCOL as bal3,
mCOL as bal4, mCOL as bal5, mCOL as bal6
from @table t inner join cte c on t.clientname = c.clientname
看看这个,我假设您想要“如果行有任何值,用该值填充空值”。对吗?如果一行有空值,但有不同的非空值,该怎么办?如果一行完全为空怎么办?请描述您期望的行为。行数不止这些,对吗?@Bob,1>您的假设是正确的。2> 在这种情况下,不可能得到所有的空值。等等,这些值总是相同的吗?你真的只需要第一个非空列吗?看看这个,我假设你想要“如果行有任何值,用该值填充空值”。对吗?如果一行有空值,但有不同的非空值,该怎么办?如果一行完全为空怎么办?请描述您期望的行为。行数不止这些,对吗?@Bob,1>您的假设是正确的。2> 在这种情况下,不可能获得所有的空值。等等,这些值是否总是相同的,并且您真的只需要第一个非空列?这可能需要永远…:-)@codingbiz是的,它很可能需要永远,但我也假设它只需要运行一次:)那可能需要永远…:-)@codingbiz是的,它很可能需要永远,但我也假设它只需要运行一次:)