Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.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 Pivot查询_Sql_Pivot - Fatal编程技术网

列数未知的简单SQL Pivot查询

列数未知的简单SQL Pivot查询,sql,pivot,Sql,Pivot,我有以下样本数据: Item Location A K A X B W B Z B Y C L 我希望得到这样的结果: Item Loc1 Loc2 Loc3 A K X B W Z Y C L 是否可以使用SQL Pivot运算符?我更喜欢条件聚合: select item, max(case when seqnum = 1 then location end)

我有以下样本数据:

Item  Location
A   K
A   X
B   W
B   Z
B   Y
C   L
我希望得到这样的结果:

Item    Loc1    Loc2    Loc3
A       K       X
B       W       Z       Y
C       L

是否可以使用SQL Pivot运算符?

我更喜欢条件聚合:

select item,
       max(case when seqnum = 1 then location end) as location_1,
       max(case when seqnum = 2 then location end) as location_2,
       max(case when seqnum = 3 then location end) as location_3
from (select t.*, 
             row_number() over (partition by loc order by loc) as seqnum
      from t
     ) t
group by item;

下面是一种将pivot查询语法与动态sql结合使用以生成所需格式的列的方法

首先,我使用一个表变量来存储列名,这是使用一个窗口函数生成的,该函数对项目进行分区,然后对位置进行排序,并将其与“Loc”组合以生成Loc1、Loc2等

然后我将这些信息导入一个变量,该变量将形成列列表。这是通过while循环来完成的,以按顺序添加每个新列

从那里,我整理了列列表以删除尾随的逗号

之后,我生成sql语句,在相关点解析中的列变量。然后我执行这个命令,生成所需的结果集

create table #table (
    item char(1),
    location char(1)
);

insert #table (item, location)
values
('A',   'K'),
('A',   'X'),
('B',   'W'),
('B',   'Z'),
('B',   'Y'),
('C',   'L');

declare @pivotcols nvarchar(max)='';
declare @sql nvarchar(max)='';

declare @cols table (
colname nvarchar(150),
rowno int
);


insert @cols
select distinct '[Loc'+cast(rowno as nvarchar(10))+'],', rowno from
(
select row_number()over(partition by item order by location) as rowno,
       item, location 
from #table t)colgenerator;

while exists (select 1 from @cols)
    begin
    select top 1 @pivotcols = @pivotcols+colname from @cols order by rowno;
    delete from @cols where rowno in (select top 1 rowno from @cols order by rowno);
    end


select @pivotcols=substring(@pivotcols, 1, len(@pivotcols)-1);

select @sql=N'select item, '+@pivotcols+'
from (
select rowno, item, location from
(
select ''Loc''+cast(row_number()over(partition by item order by location) as nvarchar(1000)) as rowno,
       item, location 
from #table t)x)src
pivot (max(location) for rowno in ('+@pivotcols+')) piv;';


exec(@sql);

drop table #table;

一般来说,不知道,如果您不知道列的确切数量,那么透视查询和透视运算符都无法满足您的要求。然后必须使用动态SQL来构建查询。