SQL创建新列(如果行值存在)
我有一个大数据集,如下所示:SQL创建新列(如果行值存在),sql,Sql,我有一个大数据集,如下所示: NAME Value Dan 1 Dan 92 Dan A4 Steve 1 Steve B10 John 4 我正在尝试将其转换为如下表: Name Value1 Value2 Value3 Dan 1 92 B10 Steve 1 B10 Null John 4 Null Null 因此,有一个
NAME Value
Dan 1
Dan 92
Dan A4
Steve 1
Steve B10
John 4
我正在尝试将其转换为如下表:
Name Value1 Value2 Value3
Dan 1 92 B10
Steve 1 B10 Null
John 4 Null Null
因此,有一个未知数量的行,我想为每个值创建一个新的列,当它存在时。有人知道如何在SQL中实现这一点吗?您提供的示例使用PIVOT将非常有效,但您需要为值提供一个类别来实现PIVOT e、 g 那么你的结果是这样的
Name Value1 Value2 Value3
Dan 1 92 A4
Steve 1 NULL B10
John 4 NULL NULL
以下是Microsoft的文档:
要动态地执行此操作,请阅读本文。它能很好地处理同样的情况。
要透视数据,您需要一些数据透视工具 在这种情况下,可以使用行号生成 例如:
--
-- sample data
--
create table yourlargetable (
id int identity(1,1) primary key,
name nvarchar(30),
value nvarchar(30)
);
insert into yourlargetable (name, value) values
('jane', 'val1'), ('jane', 'val2'), ('jane', 'val3'),
('john', 'val4'), ('john', 'val5');
--
-- declare a few variables
--
declare @DynSql nvarchar(max);
declare @Cols nvarchar(max);
declare @ColTotal int;
--
-- how many columns are needed
--
select top 1 @ColTotal = count(*)
from yourlargetable
group by name
order by count(*) desc;
--
-- generate a string with column names
--
with RCTE_NUMS as
(
select 1 as n
union all
select n+1
from RCTE_NUMS
where n < @ColTotal
)
select @Cols = concat(@Cols+', ', quotename(concat('Value', n)))
from RCTE_NUMS
order by n;
--
-- create the dynamic sql string
--
set @DynSql = 'select *'+ char(10) +
'from ('+
'select name, value '+ char(10) +
', concat(''Value'', row_number() over (partition by name order by value)) col '+ char(10) +
'from yourlargetable) s'+ char(10) +
'pivot (max(value) '+ char(10) +
'for col in ('+ @Cols +')) p'+ char(10) +
'order by name';
-- select @DynSql;
--
-- run the dynamic sql
--
exec sp_executesql @DynSql;
name Value1 Value2 Value3
jane val1 val2 val3
john val4 val5 NULL
请考虑为我们提供一个可以帮助社区回答您的问题。换句话说,到目前为止你都尝试了什么,为什么不奏效?谢谢,是的,我理解。但是,行的数量未知,在1到50之间变化很大。我想知道是否有一种方法可以以某种方式利用带有case语句的循环。我已经更新了答案,添加了一个关于如何动态执行此操作的链接。Hello FlogDonkey,at的动态解决方案非常有效。
name Value1 Value2 Value3
jane val1 val2 val3
john val4 val5 NULL