2

我有两张桌子,即。#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 表中,Allocation 可以介于 0 和 1 之间。

User_Details 表是一个事务表,#Exported_Data 表是一个临时表,其中包含所有需要根据特定条件插入到事务表中的记录。

我有一个查询:

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 表中获取用户的 sum(Allocation)

(3) 如果 (1) + sum(Allocation) < 1 的分配,则此分配值否则跳过插入

我尝试使用 CASE 语句,但它变得太复杂而无法形成正确的查询。在插入时,我正在检查事务表中是否存在组合(User_ID、Office_ID、Dept_Id、Service_ID)。查询不应插入重复行。它应该只插入唯一的行。例如,用户 1 可以在两个不同的部门,或者可以有不同的服务 ID。

在此处输入图像描述

我在查询中想要的分配值是:

#Exported_Data + sum(ServiceAllocation) 的分配值

4

1 回答 1

0

我对您的行为和想法没有充分的想象。但是您知道 RKH ,如果我是您,我会尝试将sum(ServiceAllocation)带入变量以进行简短查询。

您还告诉如果#Exported_Data.Allocation + sum(ServiceAllocation) >= 1然后跳过插入,因此您可以将其放入 where 子句以避免获取这些行。

在我的想法中,您必须使用case when statementfunction。但我建议您在下面使用此代码。可能有用。您也可以在查询上方声明一个变量(不在或作为函数)。

(就我个人而言,我不喜欢函数,因为它使我的查询降低了两到三倍,特别是在大查询中)

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

也许这并不完全接近您的目标,但这只是一个建议

于 2013-05-19T19:30:34.517 回答