代码之家  ›  专栏  ›  技术社区  ›  Matthew Jones

SQL查询-从三列创建网格

  •  1
  • Matthew Jones  · 技术社区  · 15 年前

    我的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 回复  |  直到 15 年前
        1
  •  1
  •   marc_s    15 年前

    是的,您可以在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 要更改的关系运算符 表值表达式转换为另一个 表。透视旋转表值 通过将 中一列的值 表达式转换为多列 输出,并执行聚合 在任何地方 其余列值为 在最终输出中需要。无支点 对执行相反的操作 通过旋转 表值表达式转换为列 价值观。

    所以你基本上取一个变量 VarID 并将其不同的值(001、002、003)和这些值的聚合(sum(hours))转换为新的“pivot”表的列。

    马克

        2
  •  0
  •   Beth    15 年前

    您需要交叉表查询。不幸的是,在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)
    

    我的视图(家庭护理)是我要透视的视图,家庭护理是要透视的列,总和(计数)是我的值。