-4

ダイビングの仕方を教えてください

ID     SN    Types
1      123   ABC,XYZ,TEST, RJK,CDF,TTT,UMB,UVX
2      234   RJK,CDF,TTT,UMB,UVX,TTT,UMB,UVX
3      345   OID,XYZ,TTT,UMB,UVX,TTT,UMB,UVX

なので

 ID     SN    Types1  Types2  Types3  Types4  Types5  Types6  Types7  Types8
 1      123   ABC       XYZ    TEST     RJK    CDF     TTT     UMB     UVX  
 2      234   RJK       CDF    TTT      UMB    UVX     TTT     UMB     UVX 
 3      345   OID       XYZ    TTT      UMB    UVX     TTT     UMB     UVX 

私にSQLコードを送ってくださいありがとう、

4

2 に答える 2

2

まず、順序を維持する分割関数を作成します。

CREATE FUNCTION [dbo].[SplitStrings_Ordered]
(
    @List       NVARCHAR(MAX),
    @Delimiter  NVARCHAR(255)
)
RETURNS TABLE
AS
    RETURN (SELECT [Index] = ROW_NUMBER() OVER (ORDER BY Number), Item 
    FROM (SELECT Number, Item = SUBSTRING(@List, Number, 
      CHARINDEX(@Delimiter, @List + @Delimiter, Number) - Number)
     FROM (SELECT ROW_NUMBER() OVER (ORDER BY [object_id])
      FROM sys.all_objects) AS n(Number)
      WHERE Number <= CONVERT(INT, LEN(@List))
      AND SUBSTRING(@Delimiter + @List, Number, LEN(@Delimiter)) = @Delimiter
    ) AS y);

これで、この機能を と組み合わせて使用​​できますPIVOT。これは自己完結型の例ですが@d、最後のクエリを実際のテーブルに置き換えることができます。

DECLARE @d TABLE(ID INT, SN INT, Types NVARCHAR(MAX));

INSERT @d VALUES
(1,123,N'ABC,XYZ,TEST, RJK,CDF,TTT,UMB,UVX'),
(2,234,N'RJK,CDF,TTT,UMB,UVX,TTT,UMB,UVX'  ),
(3,345,N'OID,XYZ,TTT,UMB,UVX,TTT,UMB,UVX'  );

SELECT ID,SN,
 Types1 = [1], Types2 = [2], Types3 = [3], Types4 = [4],
 Types1 = [5], Types6 = [6], Types7 = [7], Types8 = [8]
FROM @d AS d CROSS APPLY dbo.SplitStrings_Ordered(d.Types, ',') AS y
PIVOT (MAX(Item) FOR [Index] IN ([1],[2],[3],[4],[5],[6],[7],[8])) AS p;
于 2013-11-11T04:59:55.327 に答える
0

T-SQL は、コンマ区切り値の処理には適していません。ただし、 Recursive CTEを創造的に使用すると、あまり労力をかけずに列を分割できます。次のクエリは、元のデータの行に合計 8 を超えるタイプが存在しないことを前提としています。任意の数のタイプを処理するように簡単に拡張できます (動的ではありませんが、最大数がわかっている必要があります)。

;with TypesSplit as (

    select [ID], [SN], 1 as [Index],
    case when CHARINDEX(',', [Types]) <> 0 then substring([Types], CHARINDEX(',', [Types])+1, 1000) else '' end as [Types],
    case when CHARINDEX(',', [Types]) <> 0 then substring([Types], 1, CHARINDEX(',', [Types])-1) else [Types] end as [Type]
    from Types

    union all

    select [ID], [SN], [Index] + 1 as [Index],
    case when CHARINDEX(',', [Types]) <> 0 then substring([Types], CHARINDEX(',', [Types])+1, 1000) else '' end as [Types],
    case when CHARINDEX(',', [Types]) <> 0 then substring([Types], 1, CHARINDEX(',', [Types])-1) else [Types] end as [Type]
    from TypesSplit
    where LEN([Types])>0

)
select [ID],[SN],
    max(case when [Index]=1 then [Type] end) as Types1,
    max(case when [Index]=2 then [Type] end) as Types2,
    max(case when [Index]=3 then [Type] end) as Types3,
    max(case when [Index]=4 then [Type] end) as Types4,
    max(case when [Index]=5 then [Type] end) as Types5,
    max(case when [Index]=6 then [Type] end) as Types6,
    max(case when [Index]=7 then [Type] end) as Types7,
    max(case when [Index]=8 then [Type] end) as Types8
from TypesSplit
group by [ID],[SN]

(デモ: http://www.sqlfiddle.com/#!6/c522f/9 )

基本的な考え方は、CHARINDEXを使用して各コンマの位置を見つけ、次にSUBSTRINGを使用して各型を最初から分割することです。再帰は、消費する型がなくなるまで、すべての型をループします。タイプは[Index]、出力で同じ順序で再現できるように、列を介して番号が付けられます。出力は基本的に、再帰 CTE によって生成された行データのピボット テーブルであり、ピボット前は次のようになります。

| ID |  SN | INDEX |                        TYPES | TYPE |
|----|-----|-------|------------------------------|------|
|  1 | 123 |     1 | XYZ,TEST,RJK,CDF,TTT,UMB,UVX |  ABC |
|  2 | 234 |     1 |  CDF,TTT,UMB,UVX,TTT,UMB,UVX |  RJK |
|  3 | 345 |     1 |  XYZ,TTT,UMB,UVX,TTT,UMB,UVX |  OID |
|  3 | 345 |     2 |      TTT,UMB,UVX,TTT,UMB,UVX |  XYZ |
|  3 | 345 |     3 |          UMB,UVX,TTT,UMB,UVX |  TTT |
|  3 | 345 |     4 |              UVX,TTT,UMB,UVX |  UMB |
|  3 | 345 |     5 |                  TTT,UMB,UVX |  UVX |
|  3 | 345 |     6 |                      UMB,UVX |  TTT |
|  3 | 345 |     7 |                          UVX |  UMB |
|  3 | 345 |     8 |                              |  UVX |
|  2 | 234 |     2 |      TTT,UMB,UVX,TTT,UMB,UVX |  CDF |
|  2 | 234 |     3 |          UMB,UVX,TTT,UMB,UVX |  TTT |
|  2 | 234 |     4 |              UVX,TTT,UMB,UVX |  UMB |
|  2 | 234 |     5 |                  TTT,UMB,UVX |  UVX |
|  2 | 234 |     6 |                      UMB,UVX |  TTT |
|  2 | 234 |     7 |                          UVX |  UMB |
|  2 | 234 |     8 |                              |  UVX |
|  1 | 123 |     2 |     TEST,RJK,CDF,TTT,UMB,UVX |  XYZ |
|  1 | 123 |     3 |          RJK,CDF,TTT,UMB,UVX | TEST |
|  1 | 123 |     4 |              CDF,TTT,UMB,UVX |  RJK |
|  1 | 123 |     5 |                  TTT,UMB,UVX |  CDF |
|  1 | 123 |     6 |                      UMB,UVX |  TTT |
|  1 | 123 |     7 |                          UVX |  UMB |
|  1 | 123 |     8 |                              |  UVX |

ピボット後、最終的な出力は次のようになります。

| ID |  SN | TYPES1 | TYPES2 | TYPES3 | TYPES4 | TYPES5 | TYPES6 | TYPES7 | TYPES8 |
|----|-----|--------|--------|--------|--------|--------|--------|--------|--------|
|  1 | 123 |    ABC |    XYZ |   TEST |    RJK |    CDF |    TTT |    UMB |    UVX |
|  2 | 234 |    RJK |    CDF |    TTT |    UMB |    UVX |    TTT |    UMB |    UVX |
|  3 | 345 |    OID |    XYZ |    TTT |    UMB |    UVX |    TTT |    UMB |    UVX |
于 2013-11-11T04:22:17.007 に答える