0

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

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

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

然后结果集应该如图 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:表名:值结果集 - 组合值后

4

2 回答 2

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
于 2013-03-28T00:48:40.127 回答
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');

这是魔术开始的地方,我们使用一个公共表表达式来计算字段的新值应该是什么,并在动态表中命名新的值:更新

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
于 2013-03-28T00:54:29.110 回答