在SQL查询中使用条件计算列

时间:2013-05-18 18:24:42

标签: sql-server sql-server-2008

我有两张桌子即。 #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。

enter image description here

我想要查询的分配值是:

#Exported_Data + sum(ServiceAllocation)的分配值

1 个答案:

答案 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

也许它不是那么接近你的目标,但它只是一个建议