2

1 ~ 6 個の値を持つ多数の ROWS があります。例えば:

Param1: A|B|C|D
Param2: B|Y
Param3: A

次のように変換する必要があります。

Param1: A
Param1: B
Param1: C
Param1: D
Param2: B
Param2: Y
Param3: A

まあ、pivot-unpivot は機能するかもしれませんが、取得する必要がある条件とフィールドがたくさんあります。また、すべての値を分割してカウントするビューがあります。上の例では、次のようなデータセットが返されます。

A 2
B 2
C 1
D 1
Y 1

これは私自身の例で、いくつかのレコードでは問題なく動作し、100000 行を超えると非常にうまく機能しません。

最初の話はこれについてです。いくつかのオブジェクト (obj) があり、それぞれに値 (val) を持つ params (prm) があります。ご覧のとおり、各オブジェクトはツリーのようなもので、展開する必要があります。ここにシミュレーションがあります:

DECLARE @x TABLE
    (
      prm INT ,
      iin VARCHAR(20) ,
      oout VARCHAR(20)
    ) 
INSERT  INTO @x
VALUES  ( 1, 'A/B/C', 'A' )
INSERT  INTO @x
VALUES  ( 1, 'A/B/C', 'B' )
INSERT  INTO @x
VALUES  ( 1, 'A/B/C', 'C' )
INSERT  INTO @x
VALUES  ( 3, 'D', 'D' )
INSERT  INTO @x
VALUES  ( 2, 'R/G', 'R' )
INSERT  INTO @x
VALUES  ( 2, 'R/G', 'G' )

DECLARE @y TABLE
    (
      obj INT ,
      prm INT ,
      val VARCHAR(20)
    ) 
INSERT  INTO @y
VALUES  ( 10, 1, 'A/B/C' )
INSERT  INTO @y
VALUES  ( 10, 2, 'R/G' )
INSERT  INTO @y
VALUES  ( 10, 3, 'D' )
INSERT  INTO @y
VALUES  ( 20, 2, 'R/G' )
INSERT  INTO @y
VALUES  ( 20, 3, 'D' )

DECLARE @z TABLE
    (
      id INT ,
      obj INT ,
      prm INT ,
      val VARCHAR(20)
    ) 
INSERT  INTO @z
VALUES  ( 1, 10, 1, NULL ) 
INSERT  INTO @z
VALUES  ( 2, 10, 1, NULL ) 
INSERT  INTO @z
VALUES  ( 3, 10, 1, NULL ) 
INSERT  INTO @z
VALUES  ( 4, 10, 2, NULL ) 
INSERT  INTO @z
VALUES  ( 5, 10, 2, NULL ) 
INSERT  INTO @z
VALUES  ( 6, 10, 3, NULL ) 
INSERT  INTO @z
VALUES  ( 7, 20, 2, NULL ) 
INSERT  INTO @z
VALUES  ( 8, 20, 2, NULL ) 
INSERT  INTO @z
VALUES  ( 9, 20, 3, NULL )

そして決定:

;
WITH    a AS ( SELECT   ROW_NUMBER() OVER ( PARTITION BY prm ORDER BY prm ) n ,
                    *
           FROM     @x
         ),
    b AS ( SELECT   ROW_NUMBER() OVER ( PARTITION BY obj, prm ORDER BY obj, prm ) n ,
                    *
           FROM     @z
         )
UPDATE  b
SET     b.val = a.oout
FROM    b
        INNER JOIN @y y ON y.obj = b.obj
                           AND y.prm = b.prm
        INNER JOIN a ON a.n = b.n
                        AND a.prm = b.prm
                        AND y.val = a.iin
SELECT  *
FROM    @z

@yテーブル - 最初の例のような引数を持つテーブルです。ここで、 Param1 ,Param2 は列prmの 1,2セットであり、 obj
のオブジェクトに関するものです。値で埋められる@x テーブル - @zテーブルの null 値を実際のランク付けされた値に置き換えて、 @ yテーブルに適用する値の分割のシミュレーションです。

これを行うより良い方法はありますか?

4

1 に答える 1

2

完全な解決策は提供しませんが、このような分割データが必要な場合は、使用しようとしますsqlxml(パフォーマンスが問題ないかどうかを確認するには、多数の行で試してみる必要があります)。

declare @x table (prm int,iin varchar(20))

insert into @x values(1, 'A/B/C')
insert into @x values(3, 'D')
insert into @x values(2, 'R/G')

select
    x.prm, x.iin, T.C.value('.', 'nvarchar(max)') as oout
from @x as x
    outer apply (
        select cast('<d>' + replace(x.iin, '/', '</d><d>') + '</d>' as xml) as Data
    ) as D
    outer apply D.Data.nodes('d') as T(C)

sql fiddle demoて試してみてください。

于 2013-08-29T16:37:36.687 に答える