我正在尝试删除重复项,因为我想在“ EnterpriseId”列中仅显示一个名称,并且该名称中的值最高(在这种情况下为1300)。因此,基本上,如果我对globalofferingleadnm和managernm具有相同的名称,那么我只想为globalofferingleadnm删除Managernm获得一个值。
这是用于SQL
-- Set Variables
Declare @M1 as INT
Declare @M2 as INT
Set @M1 = '1300'
Set @M2 = '949'
Select
a.globalofferingleadnm as 'EnterpriseID',
Case
When a.GlobalOfferingLeadNm = a.GlobalOfferingLeadNm then @M1 end as 'FlairID'
from Offering_vw a
where a.OfferingClassNm <> 'Asset Group'
GROUP BY
a.GlobalOfferingLeadNm
UNION
select
a.ManagerNm as 'EnterpriseID',
Case
When a.ManagerNm = a.ManagerNm then @M2 end as 'FlairID'
from Offering_vw a
where a.ManagerNm <> a.GlobalOfferingLeadNm AND a.OfferingClassNm <> 'Asset Group'
Group By
a.ManagerNm
如果名称由globalofferingleadnm和managernm重复,我只想获取globalofferingleadnm并删除managernm。
答案 0 :(得分:0)
看来您真的是想对两个查询进行联接,而不是UNION。您只希望每个EnterpriseID仅显示一行吗?
也许会有更优雅的解决方案将两个查询组合在一起,但是您始终可以将它们分开,并执行某种形式的联接以获取结果。
在这种情况下,我尝试了完全外部联接,因为似乎两个查询中的任何一个都可能有一行。
(注意:如果没有DDL和SQL Server数据库,我将无法测试)
with q1 as(
Select
a.globalofferingleadnm as 'EnterpriseID',
Case
When a.GlobalOfferingLeadNm = a.GlobalOfferingLeadNm then @M1 end as 'FlairID'
from Offering_vw a
where a.OfferingClassNm <> 'Asset Group'
GROUP BY
a.GlobalOfferingLeadNm
),
q2 as(
select
a.ManagerNm as 'EnterpriseID',
Case
When a.ManagerNm = a.ManagerNm then @M2 end as 'FlairID'
from Offering_vw a
where a.ManagerNm <> a.GlobalOfferingLeadNm AND a.OfferingClassNm <> 'Asset Group'
Group By
a.ManagerNm
)
select coalesce(q1.EnterpriseID, q2.EnterpriseID) as 'EnterpriseID',
case when q1.EnterpriseID is not null then q1.'FlairID' else q2.'FlairID' end as 'FlairID'
from q1 full outer join q2 on q1.'EnterpriseID' = q2.'EnterpriseID';
此方法使用WITH
子句,为方便起见,更容易将两个查询视为表,将其视为q1和q2。
然后,将q1和q2通过完全外部联接进行联接-无论它来自哪个来源,都会有一行。
之所以需要coalesce
,是因为两个EnterpriseID
键之一可能由于完全外部联接而为null。
最后,在case
语句中返回了FlairID
的首选源。
答案 1 :(得分:0)
我相信在这种情况下,您需要导出临时表,然后在不存在初始结果的情况下将它们合并,因为globalofferingleadnm优先。另外,不确定是否需要这些case语句。
-- Set Variables
Declare @M1 as INT
Declare @M2 as INT
Set @M1 = '1300'
Set @M2 = '949'
Select
a.globalofferingleadnm as 'EnterpriseID',
@M1 'FlairID'
into
#temp 1
from
Offering_vw a
where
a.OfferingClassNm <> 'Asset Group'
GROUP BY
a.GlobalOfferingLeadNm
;
select
a.ManagerNm as 'EnterpriseID',
@M2 'FlairID'
into
#temp2
from
Offering_vw a
where
a.ManagerNm <> a.GlobalOfferingLeadNm AND a.OfferingClassNm <> 'Asset Group'
Group By
a.ManagerNm
;
insert into
#temp1
select
EnterpriseID
,FlairID
from
#temp2 A
where
exists
(select 1
from
#temp1 B
where
A.EnterpriseID <> B.EnterpriseID)
;
select *
from
#temp1
;