Sql 哪个SELECT语句将从表行中获取非零值?
如果我在一个27列的表中有多行,它们都是这样的整数Sql 哪个SELECT语句将从表行中获取非零值?,sql,tsql,sql-server-2005,Sql,Tsql,Sql Server 2005,如果我在一个27列的表中有多行,它们都是这样的整数 id_1 id_2 id_3 id_4 id_5 id_6 id_7 id_8 id_9 id_10 id_11 id_12 id_13 id_14 id_15 id_16 id_17 id_18 id_19 id_20 id_21 id_22 id_23 id_24 id_25 id_26 id_27 0 2
id_1 id_2 id_3 id_4 id_5 id_6 id_7 id_8 id_9 id_10 id_11 id_12 id_13 id_14 id_15 id_16 id_17 id_18 id_19 id_20 id_21 id_22 id_23 id_24 id_25 id_26 id_27
0 2 0 4 5 0 0 8 0 10 0 0 0 14 0 0 17 0 0 0 21 0 0 0 0 0 0
我想运行一个SELECT语句,得到最多8列>零的列。永远不会超过8列。什么是最好的方法,或者至少是功能性的方法?如果没有8个大于0的值,则允许为空。因此,从上面得到的表格将是
col1 col2 col3 col4 col5 col6 col7 col8
2 4 5 8 10 14 17 21
如果您能忍受列中的结果,那么这是一种简单的方法:
select top 8 v.col
from table t cross apply
values ((t.id_1), (t.id_2), . . ., (t.id_27)) as v(col)
where v.col <> 0;
所有数据都是8。如果希望每行8个,则需要行标识符。您还可以使用窗口功能:
select t.id, v.col
from (select t.id, v.col,
row_number() over (partition by t.id order by (select null)) as seqnum
from table t cross apply
values ((t.id_1), (t.id_2), . . ., (t.id_27)) as v(col)
where col <> 0
) t
where seqnum <= 8;
最后,您可以将它们转回到一行。我倾向于使用条件聚合:
select t.id,
max(case when seqnum = 1 then v.col end) as val1,
max(case when seqnum = 2 then v.col end) as val2,
max(case when seqnum = 3 then v.col end) as val3,
max(case when seqnum = 4 then v.col end) as val4,
max(case when seqnum = 5 then v.col end) as val5,
max(case when seqnum = 6 then v.col end) as val6,
max(case when seqnum = 7 then v.col end) as val7,
max(case when seqnum = 8 then v.col end) as val8
from (select t.id, v.col,
row_number() over (partition by t.id order by (select null)) as seqnum
from table t cross apply
values ((t.id_1), (t.id_2), . . ., (t.id_27)) as v(col)
where col <> 0
) t
where seqnum <= 8
group by id;
我想我们可以通过程序的帮助来实现它。你想要每行8个值还是所有行8个值?如果是每行,是否有行标识符?@GordonLinoff没有标识符,但它是一个临时表,因此我可以在必要时添加一个。每行8个值,语法错误。我现在添加了一个名为id的标识符,我的表名为tester。这将如何改变你的脚本请?