我的SQL表有三列:SQL查询 - 由三列
TaskID VarID Hours 001 001 10 001 002 40 001 003 100 002 001 50 002 002 80 002 003 90
我要产生如以下
TaskID VarID -> 001 002 003 001 10 40 100 002 50 80 90
我想输出有一些查询或功能可以帮助我做到这一点。有任何想法吗?
我的SQL表有三列:SQL查询 - 由三列
TaskID VarID Hours 001 001 10 001 002 40 001 003 100 002 001 50 002 002 80 002 003 90
我要产生如以下
TaskID VarID -> 001 002 003 001 10 40 100 002 50 80 90
我想输出有一些查询或功能可以帮助我做到这一点。有任何想法吗?
是的,你可以很容易地在SQL Server 2005中做到这一点 - 神奇的词是PIVOT
。
这里有您需要查询:
SELECT
TaskID,
[001], [002], [003]
FROM
YourTable
PIVOT
(
SUM(HOURS)
FOR VarID IN ([001], [002], [003])
)
AS YourPivot
ORDER BY
YourPivot.TaskID
透视表的想法是有点棘手,在第一神交 - 也许这些信息的其他来源将帮助:
从MSDN的解释可能会提供一些线索:
您可以使用PIVOT和UNPIVOT 关系运算符来改变 表值表达式到另一个 表。 PIVOT通过从一个列中的输出转动独特 值在 表达为多列在 旋转的表值 表达,并且执行在那里它们被要求在该是 希望在最终的任何 其余列值聚合 输出。 UNPIVOT 通过将 表值表达式的列转换为 值来执行与 PIVOT相反的操作。
所以你基本上可以带可变VarID
并把它的不同的值(001,002,003)及以上的合计(SUM(小时))到一个新的“支点”表的列。
Marc
您需要一个交叉表查询。不幸的是,这在SQL Server中并不容易。在MS Access中非常容易(有一个向导可以帮助您。)
您需要使用PIVOT功能。我使用一个存储过程是这样的:
CREATE PROCEDURE [dbo].[usp_pivot_sa_byHomeCare] AS
DECLARE @columns VARCHAR(1000)
SELECT @columns = COALESCE(@columns + ',[' + cast(HomeCareRating as varchar) + ']',
'[' + cast(HomeCareRating as varchar)+ ']')
FROM vw_sa_byHomeCare
GROUP BY HomeCareRating
--print @columns
DECLARE @query VARCHAR(8000)
SET @query = '
SELECT *
FROM vw_sa_byHomeCare
PIVOT
(
sum(count_pmin)
FOR [HomeCareRating]
IN (' + @columns + ')
)
AS p'
--print @query
EXECUTE(@query)
在我的视图(vw_sa_byHomeCare)是我想转动的观点,HomeCareRating是转动在列,总和(count_pmin)是我的价值。