SQL查询行需要动态转换为列
请帮我解决下面的问题- 我的表格中有以下数据-SQL查询行需要动态转换为列,sql,sql-server,pivot,Sql,Sql Server,Pivot,请帮我解决下面的问题- 我的表格中有以下数据- Agent Variable Chandigarh NewDelhi ABC Leads 102.00 10 ABC TotalTime 10.52 1 ABC RPH 22.79 22 ABC TotalRev 239.70 23 XYZ Leads 14.00
Agent Variable Chandigarh NewDelhi
ABC Leads 102.00 10
ABC TotalTime 10.52 1
ABC RPH 22.79 22
ABC TotalRev 239.70 23
XYZ Leads 14.00 14
XYZ TotalTime 1.52 1
XYZ RPH 21.64 21
XYZ TotalRev 32.90 32
我想要这样的解决方案
Agent Chandigarh_Leads Chandigarh_TotalTime Chandigarh_RPH Chandigarh_RPH_TotalRev NewDelhi_Leads .......
ABC 102.00 10.52 22.79 239.70 10 .......
XYZ 14 1.52 21.64 32.90 14 ............
仅供参考,我可以在列中有更多的状态,它没有限制它可能是10或20或5等,所以我需要结果动态查询。请帮助我,是否可以不使用静态查询?动态SQL+数据透视:
DECLARE @sql nvarchar(max),
@columns nvarchar(max),
@col_to_cast nvarchar(max),
@col_unpvt nvarchar(max)
--This will give:
--,[Chandigarh_Leads],[Chandigarh_RPH]....[NewDelhi_TotalRev],[NewDelhi_TotalTime]
SELECT @columns = COALESCE(@columns,'')+',['+name+'_'+Variable +']'
FROM (
SELECT DISTINCT Variable
FROM #yourtable) v
CROSS JOIN (
SELECT name
FROM sys.columns
WHERE object_id = OBJECT_ID(N'#yourtable')
AND name not in ('Agent', 'Variable')
) c
ORDER BY c.name, v.Variable
--As columns while unpivoting must be same type we need to cast them in same datattype:
--This will give
--,CAST([Chandigarh] as float) as [Chandigarh],CAST([NewDelhi] as float) as [NewDelhi]
SELECT @col_to_cast = COALESCE(@col_to_cast,'')+',CAST(' + QUOTENAME(name)+ ' as float) as '+ QUOTENAME(name)
@col_unpvt = COALESCE(@col_unpvt,'') + ','+ QUOTENAME(name)
FROM sys.columns
WHERE object_id = OBJECT_ID(N'#yourtable')
AND name not in ('Agent', 'Variable')
SELECT @sql = N'
SELECT *
FROM (
SELECT Agent,
[Columns]+''_''+Variable as ColName,
[Values] as ColVal
FROM (
SELECT Agent,
Variable'+@col_to_cast+'
FROM #yourtable
) p
UNPIVOT (
[Values] FOR [Columns] IN ('+STUFF(@col_unpvt,1,1,'')+')
) unpvt
) t
PIVOT (
MAX(ColVal) FOR ColName IN ('+STUFF(@columns,1,1,'')+')
) pvt'
EXEC sp_executesql @sql
输出:
Agent Chandigarh_Leads Chandigarh_RPH Chandigarh_TotalRev Chandigarh_TotalTime NewDelhi_Leads NewDelhi_RPH NewDelhi_TotalRev NewDelhi_TotalTime
ABC 102 22,79 239,7 10,52 10 22 23 1
XYZ 14 21,64 32,9 1,52 14 21 32 1
是的,这是可能的。您使用的是什么数据库(例如SQL Server、Oracle)?你试过谷歌“动态数据透视查询SQL”吗?SQL Server,我知道数据透视的东西,但它是不同的。你能告诉我这个问题吗?非常感谢您的回复。如果此解决方案对您有所帮助,也可以使用此解决方案完成此操作,请将答案标记为已接受/向上投票,这是表达感谢的一个好方法!