2013-02-07 26 views

回答

1

沒有看到你的表格結構等,很難給出確切的答案。但我可以建議你如何在SQL中執行此操作。你有一些以前的問題用sql server標記,所以我猜測。

;with unpiv as 
(
    select activity, 
     work, 
     Location+'_'+col as col, 
     value 
    from 
    (
     select activity, 
     work, 
     cast(AssignedTasks as varchar(50)) AssignedTasks, 
     cast(CompletedTasks as varchar(50)) AchievedTasks, 
     Location 
     from yourtable 
    ) src 
    unpivot 
    (
     value 
     for col in (AssignedTasks, AchievedTasks) 
    ) unpiv 
), 
piv as 
(
    select Activity, 
    work, 
    London_AssignedTasks, 
    London_AchievedTasks, 
    Geneva_AssignedTasks, 
    Geneva_AchievedTasks, 
    row_number() over(partition by activity order by activity, work) rn 
    from unpiv 
    pivot 
    (
    max(value) 
    for col in (London_AssignedTasks, London_AchievedTasks, 
       Geneva_AssignedTasks, Geneva_AchievedTasks) 
) piv 
) 
select case when rn = 1 then activity else '' end activity, 
    work, 
    London_AssignedTasks, 
    London_AchievedTasks, 
    Geneva_AssignedTasks, 
    Geneva_AchievedTasks 
from piv 

SQL Fiddle with Demo

您可以同時使用UNPIVOTPIVOT做到這一點。

結果是:

| ACTIVITY | WORK | LONDON_ASSIGNEDTASKS | LONDON_ACHIEVEDTASKS | GENEVA_ASSIGNEDTASKS | GENEVA_ACHIEVEDTASKS | 
------------------------------------------------------------------------------------------------------------------- 
| Activity 1 | Task 1 |     10 |     8 |     1 |     1 | 
|   | Task 2 |     15 |     15 |     100 |     25 | 
| Activity 2 | Task 1 |     5 |     5 |     0 |     0 | 
|   | Task 2 |     0 |     0 |     2 |     2 | 
| Activity 3 | Task 1 |     10 |     10 |     50 |     40 | 

編輯#1,如果你有一個未知的或動態數量的Locations那麼你可以使用動態SQL返回結果:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT ',' + QUOTENAME(Location+'_'+t.tasks) 
        from yourtable 
        cross apply 
        (
         select 'AssignedTasks' tasks 
         union all 
         select 'AchievedTasks' 
        ) t 
        group by location, tasks 
        order by location 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = ';with unpiv as 
       (
       select activity, 
        work, 
        Location+''_''+col as col, 
        value 
        from 
        (
        select activity, 
         work, 
         cast(AssignedTasks as varchar(50)) AssignedTasks, 
         cast(CompletedTasks as varchar(50)) AchievedTasks, 
         Location 
        from yourtable 
       ) src 
        unpivot 
        (
        value 
        for col in (AssignedTasks, AchievedTasks) 
       ) unpiv 
      ), 
       piv as 
       (
       select Activity, 
        work, 
        row_number() over(partition by activity order by activity, work) rn, 
        '[email protected]+' 
       from unpiv 
       pivot 
       (
        max(value) 
        for col in ('[email protected]+') 
       ) piv 
      ) 
       select case when rn = 1 then activity else '''' end activity, 
       work, 
       '[email protected]+' 
       from piv' 


execute(@query) 

SQL Fiddle with Demo

+0

感謝@bluefeet,只有一個問題,我們可以使列標題與動態位置。就像在位置一樣,可以有任何位置和多個位置。用戶可以添加儘可能多的位置,因爲他希望分配任務,所以這應該是動態的。感謝所有的幫助。 – Kashif

+0

@MuhammadKashifNadeem您可以使用動態SQL生成結果,請參閱我的編輯 – Taryn

+0

您的個人資料表明您來自亞利桑那州,而且我並不期待在這個早晨的這個時候回答:)謝謝,讓我檢查一下。 – Kashif

相關問題