0

SQL Server 2008 データベースに多数の行があります

行ごとに、気になる3つの列があります

一般的な行は次のようになります。

AccountNumber    | basecode                      | subcode
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9689787209368901 | AQTXG AQTXG AQTXG AQTXG ACC5Z | ZQ596 ZQ596 ZQ596 ZQ655 ZC655

次のように変換する SQL クエリが必要です。

AccountNumber      |    basecode| subcode
+++++++++++++++++++++++++++++++++++++++++++
9689787209368901   |    AQTXG   | ZQ596
9689787209368901   |    AQTXG   | ZQ596
9689787209368901   |    AQTXG   | ZQ596
9689787209368901   |    AQTXG   | ZQ655
9689787209368901   |    ACC5Z   | ZC655
4

2 に答える 2

0

SQL Server を使用しているため、再帰クエリを使用してデータを分割できます。このクエリでは' '、区切り文字が変更された場合、これは簡単に変更できます。クエリは次のようになります。

;with cte (AccountNumber, basecodeItem, basecode, subcodeItem, subcode) as
(
  select AccountNumber,
    cast(left(basecode, charindex(' ',basecode+' ')-1) as varchar(50)) basecodeItem,
         stuff(basecode, 1, charindex(' ',basecode+' '), '') basecode,
    cast(left(subcode, charindex(' ',subcode+' ')-1) as varchar(50)) subcodeItem,
         stuff(subcode, 1, charindex(' ',subcode+' '), '') subcode
  from yourtable
  union all
  select AccountNumber,
    cast(left(basecode, charindex(' ',basecode+' ')-1) as varchar(50)) basecodeItem,
    stuff(basecode, 1, charindex(' ',basecode+' '), '') basecode,
    cast(left(subcode, charindex(' ',subcode+' ')-1) as varchar(50)) subcodeItem,
    stuff(subcode, 1, charindex(' ',subcode+' '), '') subcode
  from cte
  where basecode > '' or subcode > ''
)
select AccountNumber, basecodeItem, subcodeitem
from cte;

デモで SQL Fiddle を参照してください

結果は次のとおりです。

|    ACCOUNTNUMBER | BASECODEITEM | SUBCODEITEM |
-------------------------------------------------
| 9689787209368900 |        AQTXG |       ZQ596 |
| 9689787209368900 |        AQTXG |       ZQ596 |
| 9689787209368900 |        AQTXG |       ZQ596 |
| 9689787209368900 |        AQTXG |       ZQ655 |
| 9689787209368900 |        ACC5Z |       ZC655 |
于 2012-12-05T10:13:19.613 に答える
0

行が常に 5 つのシーケンスで満たされている場合、これは機能するはずです

Select TableAccountNumber,SubString(basecode,1,5) as BC,SubString(Subcode,1,5) as SC
from @test
UNION ALL
Select TableAccountNumber,SubString(basecode,7,5) as BC,SubString(Subcode,7,5) as SC
from @test
UNION ALL
Select TableAccountNumber,SubString(basecode,13,5) as BC,SubString(Subcode,13,5) as SC
from @test
UNION ALL
Select TableAccountNumber,SubString(basecode,19,5) as BC,SubString(Subcode,19,5) as SC
from @test
UNION ALL
Select TableAccountNumber,SubString(basecode,25,5) as BC,SubString(Subcode,25,5) as SC
from @test

としてラップすることができます

Select * from
(
Select TableAccountNumber,SubString(basecode,1,5) as BC,SubString(Subcode,1,5) as SC,0 as Sequence
from @test
UNION ALL
Select TableAccountNumber,SubString(basecode,7,5) as BC,SubString(Subcode,7,5) as SC,1
from @test
UNION ALL
Select TableAccountNumber,SubString(basecode,13,5) as BC,SubString(Subcode,13,5) as SC,2
from @test
UNION ALL
Select TableAccountNumber,SubString(basecode,19,5) as BC,SubString(Subcode,19,5) as SC,3
from @test
UNION ALL
Select TableAccountNumber,SubString(basecode,25,5) as BC,SubString(Subcode,25,5) as SC,4
from @test
) a
order by TableAccountNumber,Sequence
于 2012-12-04T23:04:33.847 に答える