2016-02-06 6 views
0

Есть две таблицы:Показать отдельные строки таблицы с суммой столбца всех повторяющихся строк в SQL Server 2008

Tasks стол:

TaskName (PK) 

TaskAllocation стол:

 AllocationID(PK), 
    TaskName(F.K to TaskName in 'Tasks' Table), 
    UserID(F.K to ID in 'Users' Table), 
    EngineerType(F.K to ID in 'EngineerType' Table),   
    Start Date, 
    End Date, 
    Hours, 
    Location 

'Таблица пользователей:

 ID, 
    FirstName, 
    LastName 

Таблица «» EngineerTypes:

 ID, 
    Type 

Каждая задача может иметь несколько allocations.Hence, то TaskName может происходить несколько раз в таблице распределения задач. Та же задача может быть сопоставлена ​​нескольким пользователям (UserID)

Мне нужно отобразить выбранную задачу (заданную как входной сигнал от пользовательского интерфейса), идентификаторы пользователя, назначенные этой задаче, первое вхождение даты начала, первое вхождение даты окончания и Сумма (часы) для каждого пользователя выбранных задач.

Пример: TaskAllocation данные:

 TaskName UserID TypeId StartDate EndDate Hours Location 
     Task1 1   11 Feb 5  Feb 7 1  NULL 
     Task1 1   11 Feb 6  Feb 7 2  NULL 
     Task1 1   11 Feb 7  Feb 7 3  Onsite 
     Task1 2   12 Feb 8  Feb 10 4  Offshore 
     Task1 2   12 Feb 9  Feb 10 5  NULL 
     Task1 2   12 Feb 10 Feb 10 6  NULL 

    'EngineerTypes' data : 
     ID Type 
     11 Type1 
     12 Type2 

    'Users' Data : 
     ID  FirstName 
     1  Name1 
     2  Name2 

Запрос, который я реализовал был:

                       Select TaskAllocation.UserId as UserId,Users.FirstName as Name, 
                    TaskAllocation.EngineerType as TypeId,EngineerTypes.Type as Type, 
                 min(TaskAllocation.StartDate) as AllocationStartDate, 
                     max(TaskAllocation.EndDate) as AllocationEndDate, 
                 sum(TaskAllocation.Hours) as Hours, TaskAllocation.Location 
                      from TaskAllocation join Users on TaskAllocation.UserId=Users.ID 
                      join EngineerTypes on EngineerTypes.ID = TaskAllocation.EngineerType 
                     where TaskAllocation.TaskName = Task1' group by        
    FirstName,UserId,EngineerType,Type,AllocationStartDate,AllocationEndDate,Hours,                      
                        Location,TaskName order by TaskName, UserId 

Выход: UserId Название TypeId Тип AllocationStartDate AllocationEndDate Часы Расположение

1. 126 Name1 11 Type1 2015-11-23  2015-11-25   0.1 NULL 
    2. 126 Name1 11 Type1 2015-11-24  2015-11-25   0.2 NULL 
    3. 126 Name1 11 Type1 2015-11-25  2015-11-25   0.3 NULL 
    4. 127 Name2 12 Type2 2015-11-23  2015-11-25   0.2 NULL 
    5. 127 Name2 12 Type2 2015-11-24  2015-11-25   0.3 NULL 
    6. 127 Name2 12 Type2 2015-11-25  2015-11-25   0.4 NULL 
+0

Пример данных, вывод должен быть, как и выходной дон 't соответствует – TheGameiswar

+0

Да, witohut, используя соединения, выводится пример вывода данных. Но теперь мне нужны дополнительные данные, которые также будут отображаться вместе с ним. Поэтому я использовал соединения. После использования соединений выходной сигнал отличается. Сейчас будут включены и другие таблицы. – tennisno1

+0

ok, пожалуйста, попробуйте отформатировать вопрос об удалении ненужных вещей. – TheGameiswar

ответ

0

Вы могли бы попробовать ниже способов

Method1:

select taskname, 
userid, 
min(startdate) as'first occurence', 
max(enddate) as'last occurence' 
,sum(hours) 
from t1 
group by taskname,userid 

Method2: Крест применять

select 
distinct taskname,userid,b.* 
from t1 
cross apply 
(select min(startdate) as Firstoccur,max(startdate) as secondocc,sum(hours) as hrs 
from t1 t2 where t1.taskname =t2.taskname and t1.userid=t2.userid 
group by t2.taskname,t2.userid) b 

Способ 3: оконные функции

with cte 
as 
(
select taskname,userid, 
min(startdate) over (partition by taskname,userid) as 'first', 
max(enddate) over (partition by taskname,userid) as 'second', 
sum(hours) over (partition by taskname,userid) as 'hrs', 
ROW_NUMBER() over (partition by taskname,userid order by taskname,userid) as rn 
    from t1 
    ) 
    select *from cte where rn=1 
+0

Привет, Я попробовал первый метод, включив объединения, но он отображает повторяющиеся строки. – tennisno1

+0

Можете ли вы вставлять выходные данные – TheGameiswar

+0

Когда вы группируете имя taskname, userid и применяете агрегирование в соответствии с вашими данными примера. Вы не обязаны получать дубликаты – TheGameiswar