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