SQL查询 - 从三列创建网格

时间:2009-08-25 19:36:45

标签: sql-server

我的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

我认为有一些查询或功能可以帮助我做到这一点。有什么想法吗?

2 个答案:

答案 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)是我的值。