2015-07-09 315 views
0

我必须将所有行从表中转置为SQL Server 2008 R2中的列...我已经使用Pivot将一列中的多行转换为一行与多列。我不知道我怎么能在这种情况下使用旋转......使用SQL PIVOT行列... SQL Server 2008 R2

我想转动基础上,“费用”列的表

SQL Fiddle

所需的输出是

enter image description here

同时我会努力探索相关的帖子建议....

谢谢哟ü这么多的建议...

+1

可能重复http://stackoverflow.com/questions/19590799/tsql-pivot-multiple-columns) – Amit

+0

一旦你将费用作为列,你想怎么处理这些年? (总结他们?) – Chuck

+0

@chuck ...我需要年份作为行... year1,year2,year3,year4,tear5 – Jay

回答

2

根据您想要的结果,它看起来像你需要做的逆透视变换,然后是一个支点,就像这样:

select 
    YEAR, 
    [Bps on Assets],[Setup Fee],[Account Min],[BAA Fees],[RedTail Fees (CRM)], 
    [RedTail Fees (Per User)],[External IT],[External IT Setup] 
from (
    select Expense, value, year 
    from SM_TechBundleExpnsRates 
    unpivot (
     value FOR year IN ([Year1], [Year2], [Year3], [Year4], [Year5]) 
    ) up 
) a 
pivot (
    sum(value) for expense in 
      (
      [Bps on Assets],[Setup Fee],[Account Min], 
      [BAA Fees],[RedTail Fees (CRM)], 
      [RedTail Fees (Per User)],[External IT],[External IT Setup] 
     ) 
) p 

Sample SQL Fiddle

注意这在任何方面都不是动态的,而是使用年代和费用的硬编码列值。有可能以动态的方式生成代码 - 如果你想知道如何有很多好的答案展示如何用SQL Server做动态数据透视。

编辑:没有动态版本的乐趣,它可能不是完美的,但它应该工作:

DECLARE @sql AS NVARCHAR(MAX) 
DECLARE @year_cols AS NVARCHAR(MAX) 
DECLARE @expe_cols AS NVARCHAR(MAX) 

SELECT @expe_cols= ISNULL(@expe_cols + ',','') + QUOTENAME(Expense) 
FROM (SELECT DISTINCT Expense FROM SM_TechBundleExpnsRates) AS Expenses 

SELECT @year_cols= ISNULL(@year_cols + ',','') + QUOTENAME(year) 
FROM (
    SELECT c.name AS year 
    FROM sys.tables t JOIN sys.columns c ON t.object_id = c.object_id 
    WHERE t.name = 'SM_TechBundleExpnsRates' AND c.name LIKE '%Year%' 
) AS Years 


SET @sql = N' 
SELECT 
    Year, ' + @expe_cols + '  
FROM (
    SELECT Expense, Value, Year 
    FROM SM_TechBundleExpnsRates 
    UNPIVOT (Value FOR Year IN (' + @year_cols + ')) AS up 
) a PIVOT (SUM(Value) FOR Expense IN (' + @expe_cols + ')) p' 

EXEC sp_executesql @sql 
[TSQL PIVOT多列(的
+0

@jpw ...谢谢...这现在的作品...你会如何做与动态列名相同?请回答如果你可以...... – Jay

+0

@Jay好吧,给我几分钟。 – jpw

+0

@Jay我已经更新了我的答案,包括一个动态版本 - 它可能可以做得更聪明,但已经晚了...;) – jpw