我的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
我认为有一些查询或功能可以帮助我做到这一点。有什么想法吗?
答案 0 :(得分:1)
是的,您可以在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
PIVOT表的想法一开始有点棘手 - 也许这些额外的信息来源会有所帮助:
MSDN的解释可能会有所启发:
您可以使用PIVOT和UNPIVOT 关系运算符改变一个 表值表达到另一个 表。 PIVOT旋转表值 通过转动独特的表达 来自一列中的值 表达成多个列 输出,并执行聚合 在任何地方都需要它们 剩下的列值 想要在最后的输出中。 UNPIVOT 执行相反的操作 通过旋转a的PIVOT 表值表达式到列中 值。
所以你基本上取一个变量VarID
并将它的不同值(001,002,003)和聚合(SUM(小时))转换成新的“pivot”表的列。
马克
答案 1 :(得分:0)
您需要一个交叉表查询。不幸的是,这在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是要转移的列,sum(count_pmin)是我的值。