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,我知道数据透视的东西,但它是不同的。你能告诉我这个问题吗?非常感谢您的回复。如果此解决方案对您有所帮助,也可以使用此解决方案完成此操作,请将答案标记为已接受/向上投票,这是表达感谢的一个好方法!