使用 SQL PIVOT...SQL Server 2008 R2 的列到行
Columns to Rows using SQL PIVOT... SQL Server 2008 R2
我必须将 table 中的所有行转置到 SQL Server 2008 R2 中的列...我使用 Pivot 将一列的多行转置为多列的一行.我不确定在这种情况下如何使用 pivot...
我想根据 "EXPENSE" 列
旋转 table
期望的输出是
同时我会尝试探索建议的相关帖子....
非常感谢您的建议...
根据您想要的结果,您似乎需要先执行逆轴变换,然后再执行轴,如下所示:
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
请注意,这在任何方面都不是动态的,而是对年份和费用使用硬编码列值。可以以动态方式生成代码 - 如果您想知道如何有很多好的答案显示如何使用 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
我必须将 table 中的所有行转置到 SQL Server 2008 R2 中的列...我使用 Pivot 将一列的多行转置为多列的一行.我不确定在这种情况下如何使用 pivot...
我想根据 "EXPENSE" 列
旋转 table期望的输出是
同时我会尝试探索建议的相关帖子....
非常感谢您的建议...
根据您想要的结果,您似乎需要先执行逆轴变换,然后再执行轴,如下所示:
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
请注意,这在任何方面都不是动态的,而是对年份和费用使用硬编码列值。可以以动态方式生成代码 - 如果您想知道如何有很多好的答案显示如何使用 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