Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL创建新列(如果行值存在)_Sql - Fatal编程技术网

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