3

私は一般的に SQL に不慣れで、MS SQL にも不慣れです。タイトルが私が何を望んでいるのか明確でない場合はお詫び申し上げます。

新しいテーブルにデータを派生させたい古いテーブルが 2 つあります。テーブルにはまったく同じ列がありますが、行数が異なります。新しいテーブルには、古いテーブルの各値の複数のコピーがあり、2 回しか出現しません。以下の 2 つの列の比較を参照してください: 文字と金額。

新しいテーブル:

A  0 
A  0
A  0
B  0
B  0

古いテーブル:

A  12
A  0
B  10
B  0
C  23

私が達成したいのは、古いテーブルの金額列の値を、次のように新しいテーブルの文字の最初の出現に追加することです。

A  12 
A  0
A  0
B  10
B  0

内部結合により、すべての値が埋められます (つまり、すべての A が 12 に設定されます)。

4

2 に答える 2

2

ここをクリックしてデモを見る

declare @t table
(
    val varchar(2),
    digit int
)

insert into @t(val, digit)values('A', 0)
insert into @t(val, digit)values('A', 0)
insert into @t(val, digit)values('A', 0)
insert into @t(val, digit)values('B', 0)
insert into @t(val, digit)values('B', 0)

declare @t1 table
(
    val varchar(2),
    digit int
)

insert into @t1(val, digit)values('A', 12)
insert into @t1(val, digit)values('A', 0)
insert into @t1(val, digit)values('B', 10)
insert into @t1(val, digit)values('B', 0)
insert into @t1(val, digit)values('C', 23)


Select k.val, isNull(sum(k.digit + k1.digit), 0) as Digit from 
(
    Select ROW_NUMBER() over(partition by val order by val) as rowid, * from @t
)K
Left Join
(
    Select ROW_NUMBER() over(partition by val order by val) as rowid, * from @t1
)K1
on k.val = k1.val AND K.rowid = K1.rowid
group by k.val, K.rowid
于 2012-08-07T16:48:14.143 に答える
2

これを試して:

DECLARE @test1 TABLE(col1 varchar(2),idn int)
insert into @test1
VALUES('A',0),
('A',0),
('A',0),
('B',0),
('B',0)

DECLARE @test2 TABLE(col1 varchar(2),idn int)
insert into @test2
VALUES('A',12),
('A',0),
('B',10),
('B',0),
('C',23)


;WITH CTE as (select *,ROW_NUMBER() over (partition by col1 order by col1) as rn from @test1)

update c SET c.idn=b.idn
from CTE c inner join (select col1,SUM(idn) as idn from @test2
group by col1) b
on c.col1 = b.col1 
where c.rn=1

select * from @test1
于 2012-08-07T16:40:55.320 に答える