CrossTabs SQL Server

时间:2009-12-21 20:47:48

标签: sql-server sql-server-2008 pivot

我想知道如何使用SQL Server 2008创建交叉选项卡查询。我有工作号和员工的字段,我想显示员工在特定工作上工作了多少小时。

这是查询。

SELECT Ename, JobNum, LaborHrs
FROM CombinedLabor 

将返回员工姓名列表,包括职位名称和工时。

现有表格如下:

ENAME   JOBNUM    LABORHRS
abc      N6880       8.0
abc      N6880       2.5  
xyz      N7860       9.5
...      ...         ...

所以我想要这样的东西

        N6880 N7860 ... Total Hrs
abc     10.5   0.0     ... 10.5
xyz      0.0   9.5      ... 9.5

我尝试了PIVOT,但这不起作用。后来我想用C#将这些数据导出到EXCEL。

修改

好的,这是查询。

SELECT Ename, JobNum,LaborHrs FROM CombinedLabor将返回员工姓名列表,包括职位名称和工时。

现有表格如下:

ENAME   JOBNUM    LABORHRS
abc      N6880       8.0
abc      N6880       2.5  
xyz      N7860       9.5
...      ...         ...

所以我想要这样的东西

        N6880 N7860 ... Total Hrs
abc     10.5   0.0     ... 10.5
xyz     0.0   9.5      ... 9.5

3 个答案:

答案 0 :(得分:1)

DECLARE @CombinedLabor TABLE
  ( 
   ENAME varchar(50)
  ,JOBNUM varchar(20)
  ,LABORHRS decimal(10,2)
  )

INSERT  INTO @CombinedLabor
        ( ENAME, JOBNUM, LABORHRS )
VALUES  ( 'abc', 'N6880', 8.0 )
,       ( 'abc', 'N6880', 2.5 )
,       ( 'abc', 'N6881', 5.2 )
,       ( 'xyz', 'N7860', 9.5 ) ;  

SELECT
   ENAME
  ,SUM(CASE JOBNUM WHEN 'N6880' THEN LABORHRS ELSE 0 END) AS [N6880]
  ,SUM(CASE JOBNUM WHEN 'N6881' THEN LABORHRS ELSE 0 END) AS [N6881]
  ,SUM(CASE JOBNUM WHEN 'N7860' THEN LABORHRS ELSE 0 END) AS [N7860]
  ,SUM(LABORHRS) AS [PersonTotal]
FROM   @CombinedLabor
GROUP BY ENAME


结果
alt text

答案 1 :(得分:1)

我建议您尝试在C#中进行交叉表操作:

http://code.google.com/p/pivot-tools/

我怀疑你会发现它比摆弄动态支点更容易。 (这是我的项目,如果您有任何问题,请告诉我。)


在此之前,您可能需要提前检索“Total Hrs”,如下所示:

SELECT Ename, JobNum, SUM(LaborHrs) LaborHrs, TotalHrs
FROM CombinedLabor
INNER JOIN (
SELECT Ename, SUM(LaborHrs) TotalHrs
FROM CombinedLabor
GROUP BY EName
) Totals
ON CombinedLabor.Ename = Totals.Ename
GROUP BY CombinedLabor.Ename, JobNum, TotalHrs

(建议:不同的员工可以使用相同的名称,因此您应该有一个id列来加入。)

答案 2 :(得分:1)

DECLARE @CombinedLabor TABLE
  ( 
   ENAME varchar(50)
  ,JOBNUM varchar(20)
  ,LABORHRS decimal(10,2)
  )

INSERT  INTO @CombinedLabor
        ( ENAME, JOBNUM, LABORHRS )
VALUES  ( 'abc', 'N6880', 8.0 )
,       ( 'abc', 'N6880', 2.5 )
,       ( 'abc', 'N6881', 5.2 )
,       ( 'xyz', 'N7860', 9.5 ) ;  

SELECT ENAME
    ,isnull([N6880], 0) [N6880]
    ,isnull([N6881], 0) [N6881]
    ,isnull([N7860], 0) [N7860]
    ,TotalHrs
FROM (
    SELECT ENAME
        ,JOBNUM
        ,LABORHRS
        ,sum(LABORHRS) OVER (PARTITION BY ENAME) TotalHrs
    FROM @CombinedLabor
    ) a
PIVOT(sum(LABORHRS) FOR JOBNUM IN (
            [N6880]
            ,[N6881]
            ,[N7860]
            )) AS PivotTable
ORDER BY ENAME