2010-08-19 4 views
1

각 사용자가 일주일 내내 (내부 작업 또는 외부 작업) 시간을 보내고 있지만 시간이 모두 테이블의 동일한 열에 표시하려고 시도 할 때 분할 할 수 있습니까? 2 개의 다른 칼럼으로 분류하고 여전히 각 사용자가 한 번씩 여러 번 입력 할 수있는 시간을 입력하지 않는 것을 보여줍니다.모순 된 점이있는 단점

아래의 SQL은 각 사용자에게 주 동안의 추적 시간을 알려주지 만 다른 행에는 내부 및 외부를 표시합니다.

SELECT SUM(FilteredMag_Time.mag_hoursspent) AS Time, 
     FilteredSystemUser.fullname, 
     FilteredMag_project.mag_typename 
    FROM FilteredSystemUser 
INNER JOIN FilteredMag_Task 
INNER JOIN FilteredMag_project ON FilteredMag_Task.mag_projectid = FilteredMag_project.mag_projectid 
INNER JOIN FilteredMag_Time ON FilteredMag_Task.mag_taskid = FilteredMag_Time.mag_taskid 
          ON FilteredSystemUser.systemuserid = FilteredMag_Time.createdby 
    WHERE (FilteredMag_Time.mag_starttime BETWEEN DATEADD(dd, - (DATEPART(dw, GETDATE()) - 1), GETDATE()) 
               AND DATEADD(dd, - (DATEPART(dw, GETDATE()) - 7), GETDATE())) 
GROUP BY FilteredSystemUser.fullname, FilteredMag_project.mag_typename 
ORDER BY FilteredSystemUser.fullname 

다음은 현재 출력의 예입니다.

Time    fullname    mag_typename 
------------------ --------------------- ------------------------- 
1.2500000000  David Sutton  External 
8.2500000000  Gayan Perera  External 
9.0000000000  Paul Nieuwelaar  Internal 
14.8700000000  Roshan Mehta  External 
6.0000000000  Roshan Mehta  Internal 
2.7800000000  Simon Phillips  External 
4.6600000000  Simon Phillips  Internal 
+1

당신은 예를 들어 데이터를 제공 및 예상 할 수 산출? –

답변

0

FilteredMag_project.mag_typename 가정은 '내부'또는 '외부'이며, 다음을 시도하십시오

SELECT SUM(CASE FilteredMag_project.mag_typename 
       WHEN 'INTERNAL' THEN FilteredMag_Time.mag_hoursspent 
       ELSE 0 END) AS InternalTime, 
     SUM(CASE FilteredMag_project.mag_typename 
       WHEN 'EXTERNAL' THEN FilteredMag_Time.mag_hoursspent 
       ELSE 0 END) AS ExternalTime, 
     FilteredSystemUser.fullname 
    FROM FilteredSystemUser 
INNER JOIN FilteredMag_Task 
INNER JOIN FilteredMag_project ON FilteredMag_Task.mag_projectid = FilteredMag_project.mag_projectid 
INNER JOIN FilteredMag_Time ON FilteredMag_Task.mag_taskid = FilteredMag_Time.mag_taskid 
          ON FilteredSystemUser.systemuserid = FilteredMag_Time.createdby 
    WHERE (FilteredMag_Time.mag_starttime BETWEEN DATEADD(dd, - (DATEPART(dw, GETDATE()) - 1), GETDATE()) 
               AND DATEADD(dd, - (DATEPART(dw, GETDATE()) - 7), GETDATE())) 
GROUP BY FilteredSystemUser.fullname 
ORDER BY FilteredSystemUser.fullname 
1

SQL 서버 PIVOT을 사용할 수 있습니다.

뭔가 출력

DECLARE @Table TABLE(
     userID INT, 
     typeID VARCHAR(20), 
     TimeSpent FLOAT 
) 

INSERT INTO @Table SELECT 1, 'INTERNAL', 1 
INSERT INTO @Table SELECT 2, 'INTERNAL', 1 
INSERT INTO @Table SELECT 1, 'INTERNAL', 1 
INSERT INTO @Table SELECT 1, 'INTERNAL', 1 
INSERT INTO @Table SELECT 2, 'EXTERNAL', 3 
INSERT INTO @Table SELECT 1, 'EXTERNAL', 3 

SELECT * 
FROM 
(
    SELECT userID, typeID, TimeSpent 
    FROM @Table 
) s 
PIVOT (SUM(TimeSpent) FOR typeID IN ([INTERNAL],[EXTERNAL])) pvt 

같은 :

userID  INTERNAL    EXTERNAL 
----------- ---------------------- ---------------------- 
1   3      3 
2   1      3 
+0

+1 마침내 PIVOT의 예가 제가 이해합니다. –

+0

이것은 마치 내가 한 일을하는 것처럼 보이지만 SQL에 익숙하지 않아 작동하게 만드는 방법을 찾지 못했습니다. – Simon

+0

괜찮습니다. 우리 모두는 어딘가에서 시작했다 .... X-) –