我需要通过不同的连接进行筛选,以便在10个列表中选择前4个,但是由于不一致,它们并非都从1开始,而且有些有差距。
我有以下代码来填充列表中的第一个
COALESCE (CASE
WHEN 1 IS NOT NULL THEN 1 END,
WHEN 2 IS NOT NULL THEN 2 END,
WHEN 3 IS NOT NULL THEN 3 END,
WHEN 4 IS NOT NULL THEN 4 END,
WHEN 5 IS NOT NULL THEN 5 END,
WHEN 6 IS NOT NULL THEN 6 END
) AS COL1
这很好用,问题是当我去做第二列时。它返回的值与我无法与之前的COL1相比,因为它是别名。
任何帮助都会很棒!
答案 0 :(得分:1)
在SQL Server中,这与case
语句几乎不可能 - 它们会变得非常复杂。
相反,您可以将数据展开成行,然后将数据重新聚合到单独的列中,从而过滤出NULL
。以下是使用outer apply
:
select . . ., x.*
from . . . outer apply -- all your joins go here
(select max(case when seqnum = 1 then col end) as col_1,
max(case when seqnum = 2 then col end) as col_2,
max(case when seqnum = 3 then col end) as col_3,
max(case when seqnum = 4 then col end) as col_4
from (select col, row_number() over (order by ordering) as seqnum
from (values (t1.col, 1), (t2.col, 2), . . .
) v(col, ordering)
where col is not null
) v
) x