Sql 计算并集中两个值之间的差

Sql 计算并集中两个值之间的差,sql,sql-server-2008,union,Sql,Sql Server 2008,Union,下面的查询告诉我人们在给定的时间段内开始和结束 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(su

下面的查询告诉我人们在给定的时间段内开始和结束

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 Change

e、 g


最好的方法是什么?

您可以将查询嵌入到:


由于union将尝试消除您没有的重复行,因此我也做了更改

您可以将查询嵌入到:

;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

我也改变了,因为union将尝试消除您没有的重复行

为什么需要这些行而不是列?如果您的输出具有以下列标题,
UserID、Month、Start Value、End Value、Change
@Declan\K,那么这将非常容易。我稍后会将其用作透视表,因此需要尽可能平坦的数据。最终结果是以第三列作为输出的列标题(例如,在这种情况下,5月3日的列称为“可能结束”、“可能开始”和“可能更改”)。您需要这些标题作为行而不是列的具体原因是什么?如果您的输出具有以下列标题,
UserID、Month、Start Value、End Value、Change
@Declan\K,那么这将非常容易。我稍后会将其用作透视表,因此需要尽可能平坦的数据。最终结果是列标题,第3列作为输出(例如,在这种情况下,5月3列称为“可能结束”、“可能开始”和“可能更改”),在最终的Union All中,c.Mon无法绑定。它应该绑定到什么?开裂-这绝对是一种享受!我需要好好看看CTEtake@t-clausen.dkanswer@t-你的解决方案很棒,我改变了我的解决方案,只是因为你的解决方案没有格式化。一开始,我还想对OP query进行尽可能小的更改->围绕这个查询的CTE是否可以将整个内容放在一个表函数中?在最后的Union All中,c.Mon不能绑定。它应该绑定到什么?开裂-这绝对是一种享受!我需要好好看看CTEtake@t-clausen.dkanswer@t-你的解决方案很棒,我改变了我的解决方案,只是因为你的解决方案没有格式化。一开始,我还想对OP query进行尽可能小的更改->围绕此查询的CTE是否可以将整个内容放在表函数中?我得到的数据类型+“更改”部分的列名不明确?我得到的数据类型+“更改”部分的列名不明确?
;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
;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