组合多个主键后删除重复记录

时间:2013-03-27 23:43:49

标签: sql sql-server tsql sql-server-2008-r2 sql-server-2012

我有一个场景,可以有多个类型(type1:xxxxxx,yyyyyy和type 2:aaaaa,bbbbb)关联相同的num(提供条件相同的用户名

我的意思是同一个用户名可以有多种类型,具有相同的num和p_id 现在我必须将pk 1和pk 2(图1)的值1,2,3,4,5组合在一起,因为它们对于两个主键都有类似的类型(类型1 xxxxx和类型2:aaaaa)

这些值必须与max(pk)组合,即如图1所示pk = 2

然后结果集应该如图2所示。 在组合这些值之后,我必须从表名中删除pk 1:值,应该只有max(pk)(pk = 2),因为我合并了值。

有人可以帮我解决这个问题。我非常感谢你的帮助

Pk  num    P_id   year   Value value value  value value  type    type    username
                          1      2     3     4     5     1        2

1  123456  4567   2012    $2     $5     0     0 0    xxxxx   aaaaa     mr.nice
2  123456  4567   2012    $1     $5     $2    0  0    xxxxx   aaaaa     mr.nice
3  123456  4567   2012     0     $2     0     0   0    yyyyy    bbbbb     mr.nice
Fig 1: Table name: values


Pk  num    P_id   year  Value value value  value   value  type   type    username
                          1      2     3     4       5     1      2

2  123456  4567   2012    $3   $10     $2    0   0       xxxxx   aaaaa    mr.nice
3  123456  4567   2012    $0     2      0    0     0       yyyyy   bbbbb    mr.nice

图2:表名:值 结合值

后的结果集

2 个答案:

答案 0 :(得分:0)

使用GROUP BY子句组合值。使用此子句时,需要使用聚合函数(如MAX,SUM等)。以下是您将用于解决问题的示例:

SELECT MAX(Pk),
    num,
    P_id,
    year,
    SUM(Value1),
    SUM(value2),
    SUM(value3),
    SUM(value4),
    SUM(value5),
    type1,
    type2,
    username
FROM YourTable
GROUP BY 
    num,
    P_id,
    year,
    type1,
    type2,
    username

答案 1 :(得分:0)

我没有使用你所有的领域,但你明白这个例子:

@ Fig1是一个大致类似于你想做的临时表,我们会将重要的值插入其中。

declare @fig1 table  ( PK int, val1 money, val2 money, vtype varchar(5), vtype2 varchar(5)  )
declare @uPK table ( PK int)

insert into @fig1 values
(1, 2, 5, 'xxxxx', 'aaaaa'),
(2, 1, 5, 'xxxxx', 'aaaaa'),
(3, 0, 2, 'yyyyy', 'bbbbb');

这是魔术开始的地方,我们使用公用表表达式来计算字段的新值应该是什么,在快速表上命名为new:Updates

WITH Updates 
AS (
select 
    max(PK) as PK,
    sum(val1) as Val1,
    sum(val2) as Val2
from @fig1
group by vtype, vtype2)

接下来,我们根据这个新聚合表更新值,并使用我们的OUTPUT关键字告诉我们哪些值已更新,将这些值推送到临时变量@uPK。

Update f
    set val1=U.Val1, val2=U.val2
OUTPUT INSERTED.PK into @uPK
from Updates U 
inner join @fig1 f on U.pk=f.pk;

一旦我们知道应该留下哪些,我们只需删除那些不应该存在的那些。此外,通过此删除,您可能只想删除与已更新的类型相匹配的那些,但基本的T-SQL会让您走这条路。

delete f
from @fig1 f
left outer join @uPK p on f.PK=p.PK
where p.PK is null

select * from @fig1