2016-08-27 3 views
3

列に変換する必要がある - 私は私の卓上に次のデータを持っているSQLクエリの行は、私の下のクエリを解決するために私を助けてください動的

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    ............ 
ようなソリューションが欲しいです

FYI、私は列にもっと多くの州を持つことができます、それは10や20や5などの制限がないので、私は結果の動的クエリが必要です。静的な問い合わせがなければ可能ですか?

+0

はい、それは可能です。どのデータベースを使用していますか(例:SQL Server、Oracle)?あなたはグーグル "動的ピボットクエリのSQL"を試してみましたか? –

+0

SQL Server、私はピボットのものは知っていますが、それは別のものです。私に質問をしてください。返信いただきありがとうございます。 –

+0

これは、[条件付き集計](https://stackoverflow.com/search?q=%5Bsql%5D+conditional+aggregation)を使用して行うこともできます –

答えて

0

動的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'[email protected]_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 
+0

ありがとうございました。それは私の質問を解決した。 –

+0

この解決策が助けになるなら、答えを受け入れる/ upvoteしてください、それは*ありがとう*と言う素晴らしい方法です! – gofr1

関連する問題