我有一个表#temp,我需要根据列(Tariff_Value)值删除一些重复项。
下面是SQL小提琴,我填充了随机值。
CREATE TABLE #temp
(
[acctnumber] varchar(50),
[Premnumber] varchar(50),
x varchar(5),
y varchar(5),
z varchar(5),
w varchar(5),
[Tariff_value] varchar(50)
)
INSERT INTO #temp VALUES ('1234228','234233','x','y','z','w','RATE 5M PRIVATE AREA sndfwsme')
INSERT INTO #temp VALUES ('1234228','234233','x','y','z','w','RATE 2M SM GEN SVC sdfuaisdfbeu')
INSERT INTO #temp VALUES ('3237329','234233','x','y','z','w','RATE 5M PRIVATE AREA sndfwsme')
INSERT INTO #temp VALUES ('3237329','234233','x','y','z','w','RATE 2M SM GEN SVC sdfuaisdfbeu')
INSERT INTO #temp VALUES ('6541835','234233','x','y','z','w','RATE 2M SM GEN SVC sdfuaisdfbeu')
INSERT INTO #temp VALUES ('6541835','234233','x','y','z','w','RATE 2Mdf SM GEN SVC sdfuaisdfbeu')
INSERT INTO #temp VALUES ('7545322','234233','x','y','z','w','RATE 8Msd SM GEN SVC sdfuaisdfbeu')
INSERT INTO #temp VALUES ('7545322','234233','x','y','z','w','RATE 2M SM GEN SVC sdfuaisdfbeu')
INSERT INTO #temp VALUES ('8548235','234233','x','y','z','w','RATE 5M PRIVATE AREA sndfwsme')
INSERT INTO #temp VALUES ('8548235','234233','x','y','z','w','RATE 5M12 PRIVATE AREA sndfwsme')
INSERT INTO #temp VALUES ('5482312','234233','x','y','z','w','RATE 5M6552 PRIVATE AREA sndfwsme')
INSERT INTO #temp VALUES ('5482312','234233','x','y','z','w','RATE 5M PRIVATE AREA sndfwsme')
INSERT INTO #temp VALUES ('7589631','234233','x','y','z','w','RATE 5M PRIVATE AREA sndfwsme')
INSERT INTO #temp VALUES ('7589631','234233','x','y','z','w','RATE 2M SM GEN SVC sdfuaisdfbeu')
查询的输出应该是 multipart attachments
我需要一个查询,其中可以实现以下逻辑,或者如果可能的话,任何有效的CROSS APPLY逻辑都可以获得这些逻辑。
;WITH cte1 AS
(
SELECT [acctnumber], [Premnumber],x,y,z,w,count(*) AS cnt FROM #temp
GROUP BY [acctnumber], [Premnumber],x,y,z,w
)
,
SELECT a.* FROM #temp a INNER JOIN cte1 b ON a.acctnumber = b.acctnumber AND a.Premnumber = b.Premnumber
WHERE (if b.cnt >1 then FETCH record from #temp table exclude tarriff_value like '%2M%' and fetch tarriff_value like '%5M%' )
问题:如果没有与之关联的5M记录,则输出查询不应排除2M记录。随后,它应从(2M和5M)记录中排除2M。
字面上的视觉解释
答案 0 :(得分:1)
我认为这样做会。没有使用交叉应用只是基本的左连接。
select *
from #temp t
left join
(select acctnumber, Tariff_value
from #temp
where Tariff_value like '% 2M %') t1
on t.acctnumber = t1.acctnumber
and t.Tariff_value = t1.Tariff_value
left join
(select acctnumber, Tariff_value
from #temp
where Tariff_value like '% 5M %') t2
on t1.acctnumber = t2.acctnumber
where t2.acctnumber is null
答案 1 :(得分:1)
我使用指示器在5M时将记录标记为1,而对于2M则使用2。如果该指标的总和为3,那么它是5M和2M对。我使用join来对原始表进行过滤。看看sqlfiddle中的demo; http://sqlfiddle.com/#!18/a0754/6
select t.*
from temp t join (
select acctnumber,
sum(case when Tariff_value like '%5M%'
then 1
when Tariff_value like '%2M%'
then 2 else 0 end) as is_pair
from temp
group by acctnumber) s
on t.acctnumber=s.acctnumber
where s.is_pair <> 3
or (s.is_pair=3
and t.Tariff_value like '%5M%');