2013-07-30 115 views
0

我在下面的查詢中告訴我,人們在給定的時間段內開始和結束。計算工會中兩個值之間的差異

select UserId, 
cast(sum(CommissionPerc)/100 as numeric(2,1)) as PlacementCount, 
datename(mm,startdate) + ' ' + 'Start' as DataType 
from PlacementConsultants 
group by userid, datename(mm,StartDate) 
union 
select UserId, 
cast(sum(CommissionPerc)/100 as numeric(2,1)) as PlacementCount, 
datename(mm,EndDate) + ' ' + 'End' as DataType 
from Placements 
group by userid, datename(mm,EndDate) 
order by datatype 

,其輸出如下:

791  4.0  May End 
791  3.0  May Start 
791  6.0  June End 
791  2.0  June Start 
791  1.0  July Start 

但是我也想有其中寫入爲MONTHNAME變化

例如列

791 4.0 May End 
791 3.0 May Start 
791 -1.0 May Change 

什麼是最好的方式去做這件事?

+0

任何特別的原因,爲什麼你重複的行需要這些行而不是列? 如果您輸出了以下列標題'UserID,月份,起始值,結束值,更改',這將非常簡單。 –

+0

@Declan_K我稍後將其用作數據透視表,因此需要數據儘可能平坦。最終結果是以第三列作爲輸出的列標題(例如,在這種情況下,May 3列稱爲May End,May Start和May Change) – franglais

回答

2

您可以嵌入您的查詢CTE

;with CTE1 as (
    select 
     UserId, 
     cast(sum(CommissionPerc)/100 as numeric(2,1)) as PlacementCount, 
     datename(mm,startdate) as Mon 
    from PlacementConsultants 
    group by userid, datename(mm, StartDate) 
), CTE2 as (
    select 
     UserId, 
     cast(sum(CommissionPerc)/100 as numeric(2,1)) as PlacementCount, 
     datename(mm,EndDate) as Mon 
    from Placements 
    group by userid, datename(mm, EndDate) 
) 
select C.UserId, C.PlacementCount, C.Mon + ' Start' as DataType 
from CTE1 as C 

union all 

select C.UserId, C.PlacementCount, C.Mon + ' End' as DataType 
from CTE2 as C 

union all 

select C1.UserId, C2.PlacementCount - C1.PlacementCount, C1.Mon + ' Change' as DataType 
from CTE1 as C1 
    inner join CTE2 as C2 on C2.UserId = C1.UserId and C2.Mon = C1.Mon 
order by DataType 

我也改變了union to union all因爲工會將嘗試以消除你沒有

+0

在最後的Union All中,c.Mon不能被綁定。它應該綁定什麼? – franglais

+0

固定,錯誤的別名。它應該是C1.Mon,而不是C.Mon –

+0

破解 - 這絕對是一種享受!我需要有一個適當的看CTE – franglais

1
;with a as 
(
select UserId, 
cast(sum(CommissionPerc)/100 as numeric(2,1)) as PlacementCount, 
datename(mm,startdate) as DataType 
from PlacementConsultants 
group by userid, datename(mm,StartDate) 
), b as 
(
select UserId, 
cast(sum(CommissionPerc)/100 as numeric(2,1)) as PlacementCount, 
datename(mm,EndDate) as DataType 
from Placements 
group by userid, datename(mm,EndDate) 
) 
select UserId, PlacementCount, DataType + ' Start' DataType 
from a 
union all 
select UserId, PlacementCount, DataType + ' End' DataType 
from b 
union all 
select a.UserId, b.PlacementCount- a.PlacementCount, a.DataType + ' Change' DataType 
from a 
join b 
on a.userid = b.userid and a.DataType = b.DataType 
+0

我收到了DataType +'Change'部分的模糊列名稱? – franglais

+0

+1是的,這樣更好,不需要在CTE內聯合 –

+0

@franglais fixed –

相關問題