2009-08-25 45 views
1
创建网格

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

我想输出有一些查询或功能可以帮助我做到这一点。有任何想法吗?

回答

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 

透视表的想法是有点棘手,在第一神交 - 也许这些信息的其他来源将帮助:

从MSDN的解释可能会提供一些线索:

您可以使用PIVOT和UNPIVOT 关系运算符来改变 表值表达式到另一个 表。 PIVOT通过从一个列中的输出转动独特 值在 表达为多列在 旋转的表值 表达,并且执行在那里它们被要求在该是 希望在最终的任何 其余列值聚合 输出。 UNPIVOT 通过将 表值表达式的列转换为 值来执行与 PIVOT相反的操作。

所以你基本上可以带可变VarID并把它的不同的值(001,002,003)及以上的合计(SUM(小时))到一个新的“支点”表的列。

Marc

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是转动在列,总和(count_pmin)是我的价值。