2010-08-19 6 views
1

Я пытаюсь показать, что каждый пользователь тратит свое время на неделю (внутренняя или внешняя работа), но время все в одном столбце таблицы, можно ли разбить его в 2 разных столбца и все еще иметь его так, чтобы он показывал только каждый пользователь один раз, не каждый раз, когда они вводили время, которое может быть несколько раз в течение недели.Проблема с противоречивым предложением where

В приведенном ниже 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 Server 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-) –

Смежные вопросы