0

次のようなテーブルに XML 列があります。

<word A="al"   B="h"   C="Ps" />
<word A="has"  B="es"  C="Pf" />
<word A="mom"  B="es"  C="Ph" />

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

 word  | A  | B  | C
 ====================
   al  | A1 | B1 | C1
   has | A2 | B2 | C2
   mom | A3 | B2 | C3

SQL Serverの関数でやりたい。

ありがとう!

4

1 に答える 1

2

ここでデータ型を推測し、変換するつもりはなかったと推測しますa1->A1など。

DECLARE @x TABLE(XMLFIELD XML);

INSERT @x SELECT '<word A="a1"  B="b1"  C="c1" />'
UNION ALL SELECT '<word A="a2"  B="b2"  C="c2" />'
UNION ALL SELECT '<word A="a3"  B="b2"  C="c3" />';

-- INSERT INTO dbo.OtherTable
SELECT 
  A = x.a.value('@A', 'varchar(32)'),
  B = x.a.value('@B', 'varchar(32)'),
  C = x.a.value('@C', 'varchar(32)')
FROM @x AS src
CROSS APPLY src.XMLFIELD.nodes('word') AS x(a);

結果:

A       B       C
------- ------- -------
a1      b1      c1
a2      b2      c2
a3      b2      c3

編集

そして、あなたが質問を完全に変更したので、私の答えは正気ではなく、あなたの質問とはまったく無関係に見えます。もう一度試してみましょう. ここでも、ロジックや要件を十分に説明していないため、ここでいくつか推測しています。B 列は、新しい値が表示されるたびに増加しますか? C列と同じ?連続した行にない重複がある可能性はありますか?

DECLARE @x TABLE(XMLFIELD XML);

INSERT @x SELECT '<word A="al"   B="h"   C="Ps" />'
UNION ALL SELECT '<word A="has"  B="es"  C="Pf" />'
UNION ALL SELECT '<word A="mom"  B="es"  C="Ph" />';

;WITH y AS
(
  SELECT 
    word = x.a.value('@A', 'varchar(32)'),
    n = ROW_NUMBER() OVER (ORDER BY x.a.value('@A', 'varchar(32)')),
    B = x.a.value('@B', 'varchar(32)'),
    C = x.a.value('@C', 'varchar(32)')
  FROM @x AS src
  CROSS APPLY src.XMLFIELD.nodes('word') AS x(a)
)
SELECT word, 
    A = 'A' + RTRIM(n),
    B = 'B' + RTRIM((SELECT COUNT(*)+1 FROM y AS y2 WHERE n < y.n AND B <> y.B)),
    C = 'C' + RTRIM((SELECT COUNT(*)+1 FROM y AS y2 WHERE n < y.n AND C <> y.C))
FROM y 
ORDER BY word;

結果:

word   A    B    C
------ ---- ---- ----
al     A1   B1   C1
has    A2   B2   C2
mom    A3   B2   C3

問題を実際に解決する首尾一貫した答えが必要な場合は、問題をよく説明することに取り組む必要があります (間違った問題を解決するために多大な労力を費やす前に、最初に問題を正しく理解する必要があります)。

于 2012-04-24T04:08:56.453 に答える