CrossTabs SQL Server - PullRequest
       9

CrossTabs SQL Server

0 голосов
/ 21 декабря 2009

Мне интересно, как я могу создавать запросы кросс-таблиц в 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, но это не сработало. Позже я хочу экспортировать эти данные в EXCEL с C #.

EDIT

Хорошо, вот запрос.

SELECT Ename, JobNum,LaborHrs FROM CombinedLabor, который вернет список имени сотрудника, с указанием номеров и рабочих часов.

Существующая таблица выглядит следующим образом:

<b>ENAME   JOBNUM    LABORHRS</b>
abc      N6880       8.0
abc      N6880       2.5  
xyz      N7860       9.5
...      ...         ...

Итак, я хочу что-то вроде этого

        <b>N6880 N7860 ... Total Hrs</b>
<b>abc</b>     10.5   0.0     ... 10.5
<b>xyz </b>    0.0   9.5      ... 9.5

Ответы [ 3 ]

1 голос
/ 23 января 2010

Я бы посоветовал вам попробовать сделать кросс-табуляцию в 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

(Предложение: у разных сотрудников может быть одно и то же имя, поэтому вы должны иметь столбец идентификатора для присоединения.)

1 голос
/ 29 июля 2016
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
1 голос
/ 26 декабря 2009
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

...