我想將具有多個 id 列的表從長透視到寬。我找到了針對一列的解決方案,但實際上并未針對多列找到解決方案。我可以適應一列的最接近的解決方案是這個

我的實際表有三個 _id 列和更多排列,所以我真的需要一個通用的解決方案。
基于我鏈接中的另一個解決方案,我希望這樣的事情會奏效。我調整了創建列名稱的頂部,這會起作用。我不知道如何真正調整獲取值的底部。
declare @cols nvarchar(max);
declare @sql nvarchar(max);
select @cols = stuff((
select distinct
', ' 'VarA_' convert(varchar(10),varA_id) '_VarB_' convert(varchar(10),varB_id)
from t
order by 1
for xml path (''), type).value('.','nvarchar(max)')
,1,2,'')
select @sql = '
select Id, date, ' @cols '
from (
select Id, date, varA_id = ''v'' convert(varchar(10),varA_id), value
from t
) as t
pivot (sum([value]) for [varA_id] in (' @cols ') ) p'
select @sql
exec(@sql);
uj5u.com熱心網友回復:
你的動態 sql 的主要問題是什么?
這是源查詢中構造的名稱與生成的列名稱不匹配。
這是一個修復:
declare @cols varchar(max) = null; declare @sql nvarchar(max); select @cols = concat(@cols ', ' char(10), quotename(concat('VarA_', varA_id, '_VarB_', varB_id))) from test group by varA_id, varB_id order by varA_id, varB_id; -- select @cols as cols; set @sql = 'select * ' char(10) 'from ( ' char(10) ' select [date], [value], ' char(10) ' concat(''VarA_'',varA_id,''_VarB_'',varB_id) as Col ' char(10) ' from test ' char(10) ') as src ' char(10) 'pivot (sum([value]) for Col in (' char(10) @cols char(10) ')) pvt'; -- select @sql as sql; exec(@sql);
| 日期 | VarA_1_VarB_1 | VarA_1_VarB_2 | VarA_1_VarB_3 | VarA_2_VarB_1 | VarA_2_VarB_2 | VarA_2_VarB_3 | VarA_3_VarB_1 | VarA_3_VarB_2 | VarA_3_VarB_3 |
|---|---|---|---|---|---|---|---|---|---|
| 2005-01-20 | 197 | 58 | 90 | 210 | 133 | 67 | 87 | 87 | 87 |
db<>在這里擺弄
uj5u.com熱心網友回復:
好的,到目前為止,我自己的解決方案是添加一個幫助欄,基本上只做其他問題所做的事情。我需要改進這一點,所以我不添加列,我想要更好的名字,但至少這顯示了我想要的。
alter table t add help_col nvarchar(10)
Update t
set help_col=convert(varchar(10),varA_id) convert(varchar(10),varB_id)
declare @cols nvarchar(max);
declare @sql nvarchar(max);
select @cols = stuff((
select distinct
', ' 'v' convert(varchar(10),help_col)
from t
order by 1
for xml path (''), type).value('.','nvarchar(max)')
,1,2,'')
select @sql = '
select date, ' @cols '
from (
select date, help_col = ''v'' convert(varchar(10),help_col), value
from t
) as t
pivot (sum([value]) for [help_col] in (' @cols ') ) p'
select @sql
exec(@sql);
這導致
select date, v11, v12, v13, v21, v22, v23, v31, v32, v33 from ( select date, help_col = 'v' convert(varchar(10),help_col), value from t ) as t pivot (sum([value]) for [help_col] in (v11, v12, v13, v21, v22, v23, v31, v32, v33) ) p
這產生
date v11 v12 v13 v21 v22 v23 v31 v32 v33
2005-01-20 197 58 90 210 133 67 87 87 87
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/366935.html
標籤:sql sql-server 枢
上一篇:查詢回傳到行而不是一行
下一篇:Dockercompose-無法連接到SQLServerManagementStudio中的SQLServer資料庫
