我有两张桌子即。 #Exported_Data和User_Details。
#Exported_Data:(User_Id,User_Name,Status,Office_Id,Dept_Id,Service_Id,Allocation)
User_Details:(User_Id,Office_ID,Dept_Id,Service_Id,ServiceAllocation)
在#Exported_Data表中,状态可以是非活动状态或活动状态。
在User_Details表中,分配可以介于0和1之间。
User_Details表是一个事务表,而#Exported_Data表是一个临时表,它包含所有需要根据特定条件插入到Transaction表中的记录。
我有一个问题:
insert into User_Details (User_Id, Office_ID, Dept_Id, Service_Id, ServiceAllocation)
select
User_Id,
Office_Id,
Dept_Id,
Service_Id,
Allocation
from #Exported_Data ED
where not exists (select Office_ID, Dept_ID, Service_ID from User_Details UD where UD.User_Id = ED.User_Id)
在上面的查询中,我必须根据某些条件插入一个Allocation值来代替Allocation。条件是:
如果#Exported_Data中的用户状态为非活动状态,则进行分配0,否则为
(1)从#Exported_Data
获取用户分配(2)从User_Details表中获取用户的总和(分配)
(3)如果分配(1)+总和(分配)< 1然后此分配值否则跳过插入
我尝试过使用CASE语句但是它太复杂而无法形成正确的查询。 插入时我正在检查事务表中是否存在组合(User_ID,Office_ID,Dept_Id,Service_ID)。查询不应插入重复行。它应该只插入唯一的行。例如,用户1可以位于两个不同的部门,也可以具有不同的服务ID。
我想要查询的分配值是:
#Exported_Data + sum(ServiceAllocation)的分配值
答案 0 :(得分:0)
我对你的行为和思想充满了想象力。但是你知道RKH,如果我是你,我试图将 sum(ServiceAllocation)带入一个变量中,以便简要查询。 />
你也在告诉#Exported_Data.Allocation + sum(ServiceAllocation)> = 1 然后跳过插入,所以你可以把它放到where子句中以避免获取这些行。
/>
在我的想法中,你必须使用 case when statement 或 a function 。
但是我建议你使用下面的代码。可能它很有用。你也可以在你的查询之上声明一个变量(不在或作为一个函数)。
(个人而言,我喜欢函数,因为它使我的在大查询中查询两次或有时三次降低)
Declare @Sum_ServiceAllocation as float
set @Sum_ServiceAllocation = (Select Sum(ServiceAllocation) from User_Details where User_Details.User_Id = (Select Top 1 User_Id from Exported_Data))
insert into User_Details (User_Id, Office_ID, Dept_Id, Service_Id, ServiceAllocation)
select
User_Id,
Office_Id,
Dept_Id,
Service_Id,
(case Status when 'Inactive' then 0 else (ED.Allocation + @Sum_ServiceAllocation)end) as 'Allocation'
from #Exported_Data ED
where not exists (select Office_ID, Dept_ID, Service_ID from User_Details UD where UD.User_Id = ED.User_Id)
and (ED.Allocation + @Sum_ServiceAllocation)<1
也许它不是那么接近你的目标,但它只是一个建议