我有一个noobie问题:
我需要编写SQL脚本,该脚本从给定的一个@T具有整数字段N的列表中返回3列结果集,例如:
declare @t table(n int)
insert into @t(n) values (3),(4),(5),
(6),(7),(8),
(9),(10),(11),
(13),(14),(15),
(16),(17),(18), (19)
Run Code Online (Sandbox Code Playgroud)
结果3列表应该@T按行按升序包含表中的数据.如果表中存在遗漏值(例如,{2,4}此处缺少3个)@T,则结果集中的相应单元格应为NULL.
示例1:
对于具有值{2,3,4,5} 的表,结果表应如下所示:
NULL 2 3
4 5 NULL
Run Code Online (Sandbox Code Playgroud)
示例2:对于具有值{2,4} 的表,结果表应如下所示:
NULL 2 NULL
4 NULL NULL
Run Code Online (Sandbox Code Playgroud)
你可以使用这样的数字表:
select T1.n,
T2.n,
T3.n
from Numbers as N
left outer join @T as T1
on N.Number * 3 + 1 = T1.n
left outer join @T as T2
on N.Number * 3 + 2 = T2.n
left outer join @T as T3
on N.Number * 3 + 3 = T3.n
where N.Number between 0 and (select max(n) from @T) / 3
Run Code Online (Sandbox Code Playgroud)
使用master..spt_values作为数字表的工作样本.
declare @t table(n int)
insert into @t(n) values (3),(4),(5),
(6),(7),(8),
(9),(10),(11),
(13),(14),(15),
(16),(17),(18), (19)
;with Numbers(Number) as
(
select number
from master..spt_values
where type = 'P'
)
select T1.n,
T2.n,
T3.n
from Numbers as N
left outer join @T as T1
on N.Number * 3 + 1 = T1.n
left outer join @T as T2
on N.Number * 3 + 2 = T2.n
left outer join @T as T3
on N.Number * 3 + 3 = T3.n
where N.Number between 0 and (select max(n) from @T) / 3
Run Code Online (Sandbox Code Playgroud)
或者您可以使用带有数据透视表的数字表:
select [1], [2], [3]
from
(
select (N.Number - 1) / 3 as Number,
T.n,
1 + ((N.Number - 1) % 3) as rn
from Numbers as N
left outer join @T as T on
N.Number = T.n
where N.Number between 1 and (select max(n) from @T)
) as T
pivot
(min(n) for rn in ([1], [2], [3])) as P
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
137 次 |
| 最近记录: |