2016-07-09 11 views
3

私は5つの整数IDで構成されるテーブルを持っており、これらのIDを受け取り、それらを注文し、以下のような方法でそれらを連結する列を追加したいと考えています。フィールドをSQL Serverに連結する

id1  id2  id3  id4  id5  new_col 
364  53  468  184  469  /53/184/364/468/469/ 
48  47  49  364  266  /47/48/49/266/364/ 

注文を迅速かつ簡単に実行できる機能はありますか?私が手作業で注文をコード化しなければならない場合、神は禁じます。

+3

同じ「タイプ」のデータを複数の異なる列に格納する場合、既にリレーショナルデータベースのポイントが不足しています。 ** **すべてのデータが同一で​​ある場合は、複数の行(および単一の列)として格納する必要があります。 **これらの列の順序が重要な場合(1-5の値)、メタデータではなくデータとしてモデル化する必要があります。 –

+0

行に実際の識別子がありますか?もしそうなら、アンピボットソリューションはずっと簡単になるでしょう... –

+0

@BenThul私はそれがより簡単になるのではないかと疑います。どのようなコードがありますか? –

答えて

4

あなたはまたXML PATHOnline Demo)を使用することができ、私は実際のテーブルで、すでにいくつかのid列があると思います

SELECT id1, 
     id2, 
     id3, 
     id4, 
     id5, 
     new_col = CONCAT('/', ids) 
FROM YourTable 
     CROSS APPLY (SELECT CONCAT(id, '/') 
        FROM (VALUES (id1), 
            (id2), 
            (id3), 
            (id4), 
            (id5)) V(id) 
        ORDER BY id 
        FOR XML PATH('')) C(ids) 
+1

このような素晴らしい_pseudo uppivot_! mssql2008から利用可能ですが、このトリックを見るのは初めてです。私が何も知らない場合のようにもう一度感じる))ありがとう! –

+0

@IvanStarostin 2005では、派生テーブルと 'UNION ALL' btwを使って同じことをすることができます。このようにhttp://stackoverflow.com/a/4308905/73226 –

3

これはSQL Serverの本当の痛みです。

select t.*, v.ids 
from t outer apply 
    (select ('/' + max(case when seqnum = 1 then id end) + 
       '/' + max(case when seqnum = 2 then id end) + 
       '/' + max(case when seqnum = 3 then id end) + 
       '/' + max(case when seqnum = 4 then id end) + 
       '/' + max(case when seqnum = 5 then id end) + 
       '/') as ids 
     from (select id, row_number() over (order by id) as seqnum 
      from (values(id1), (id2), (id3), (id4), (id5)) v(id) 
      ) v 
    ) v; 
1

:ここでは一つの方法です。

declare @data table (c1 int, c2 int, c3 int, c4 int, c5 int) 

insert into @data (c1, c2, c3, c4, c5) 
values 
(364, 53, 468, 184, 469), 
(48, 47, 49, 364, 266) 


;with NumberedRows as 
(
    select 
    d.c1, d.c2, d.c3, d.c4, d.c5, 
    row_number() over(order by (select 1)) rn 
    from @data d 
) 
select 
    rn, r.c1, r.c2, r.c3, r.c4, r.c5, 
    stuff(
    (
     select concat('/', p.num) 
     from 
     (
     select rr.c1, rr.c2, rr.c3, rr.c4, rr.c5 
     from NumberedRows rr 
     where rr.rn = r.rn 
    ) rr 
     unpivot (num for cols in (c1, c2, c3, c4, c5)) p 
     order by p.num 
     for xml path(''), type 
    ).value('.', 'varchar(max)') 
    , 1, 1, '') value_list 
from NumberedRows r 
order by r.rn 

enter image description here

そして、それは@Martinと@GordonによってそのVALUES(),()トリックに対してどのように見えるの上には、複雑に見えます。うん

関連する問題