1

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

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

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

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

特定のベースコードは、対応するサブコードとともに削除する必要があります。basecode と supcode はどちらも、スペースで区切られた順序付きリストです。ベースコードを入力すると、ベースコードとサブコードが削除され、残りのリストはそのまま残るクエリが必要です。

各行には、同じ数のベースコードとサブコード項目があります。コードの数は 0 ~ 45 の範囲で指定できます。同じベースコードが複数回表示される場合があります。すべてのフィールドは varchar です。

そのため、データは最終的に (動的に解析され) 次のようになります: (acct ごとに可変数のベースコード/サブコード (ペア) があるためです。

「ACC5Z」を削除しようとしている場合は、

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

「AQTXG」を削除しようとしている場合は、

AccountNumber    | basecode   | subcode
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
9689787209368901 | ACC5Z      | ZC655
4

1 に答える 1

1

これを試して

DECLARE @t TABLE (AccountNumber VARCHAR(100),Basecode VARCHAR(100),Subcode VARCHAR(100))
INSERT INTO @t SELECT 9689787209368901,'AQTXG AQTXG AQTXG AQTXG ACC5Z','ZQ596 ZQ596 ZQ596 ZQ655 ZC655'

DECLARE @BaseCodetoRemove VARCHAR(10) = 'AQTXG'

;WITH CTE AS(
SELECT  
    AccountNumber
    ,LTRIM(RTRIM(SUBSTRING(Basecode, Number ,CHARINDEX(' ', Basecode + ' ', Number ) - Number))) AS Basecode
    , LTRIM(RTRIM(SUBSTRING(Subcode, Number ,CHARINDEX(' ', Subcode + ' ', Number ) - Number))) AS Subcode
FROM @t 
JOIN master..spt_values ON Number <= DATALENGTH(Basecode) + 1  AND type='P'
AND SUBSTRING(' ' + Basecode, Number , 1) = ' ')
,CTE2 AS(
SELECT * 
FROM CTE 
WHERE BaseCode <> @BaseCodetoRemove)

SELECT AccountNumber
    ,STUFF((SELECT  ' ' + CAST(Basecode AS vARCHAR(MAX))
      FROM CTE2 t2 WHERE t1.AccountNumber = t2.AccountNumber
      FOR XML PATH('')),1,1,'')Basecode

    ,STUFF((SELECT ' ' + CAST(Subcode AS vARCHAR(MAX))
      FROM CTE2 t2 WHERE t1.AccountNumber = t2.AccountNumber
      FOR XML PATH('')),1,1,'')Subcode
FROM CTE2  t1
GROUP BY t1.AccountNumber
于 2012-12-05T03:28:21.767 に答える