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テーブルに適用する値の分割のシミュレーションです。
これを行うより良い方法はありますか?