从此表中:
Select * into #tmp from (
select 'a' A, 'b' B, NULL C union all
select 'aa' A, 'ab' B, 1 C union all
select 'aaa' A, 'bbb' B, 2 C ) x
我想得到这个结果:
A B Val
a b 1
aa ab 1
aaa bbb 2
即,取非空的最小值并替换NULL。
我想我可以将表连接到自身的过滤版本,其中不会出现空值。但这似乎有点矫枉过正。我认为这可以在MIN Aggregate子句本身中完成。
任何想法都会有所帮助,谢谢!
答案 0 :(得分:0)
声明@null int
从#tmp
中选择@null = MIN(c)选择A, B, ISNULL(c,@ null)为val1 来自#tmp
或
选择A, B, ISNULL(c,(从#tmp中选择MIN(c)))为val1 来自#tmp
答案 1 :(得分:-1)
编辑:我写道“你想要像ISNULL(c,MIN(c)这样的东西,但这是不可能的。”
但我错了,这是可能的。我在语法中遗漏了一些东西,所以@ kiki47的答案正是你所要求的。
我不会将其称为“我想我可以将表格加入到其中没有空值的过滤版本”,但是或多或少可以获得最小值并使用它。
一气呵成:
WITH cte AS (
SELECT MIN(c) minVal FROM #tmp WHERE c IS NOT NULL
)
SELECT a, b, ISNULL(c, cte.minVal)
FROM #tmp
CROSS JOIN cte
或者可能更简单(但可以针对相同的事情进行优化):
DECLARE @minVal INTEGER
SELECT @minVal = MIN(c) FROM #tmp WHERE c IS NOT NULL
SELECT a, b, ISNULL(c, @minVal) FROM #tmp