[英]Simple SQL Pivot query with unknown number of columns
我有這個樣本數據:
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;
下面是一種使用帶有動態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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.