0

私はテーブルを持っています、例えばこのセットアップを想定します

テーブルMyTableには、 Stuffという列を含むさまざまな列IdUserId、col1、 col2col3があります。

クエリを使用してMyTableから特定の列を出力したいのですが、クエリに2つの新しい列が表示されるように、「Stuff」列を分割したいと思います。

ハードコーディングされたカテゴリを定義できますが、これをSQLでどのように表すことができるかわかりません

Categoy1 = "alpha, bravo, delta, gamma';
Categoy2 = "charlie, echo, hotel';



MyTable

ID |    UserID |      Stuff       | Other Cols....
----------------------------------------------------------
1          1          alpha
2          2          hotel
3          1          charlie
4          1          echo
5          1          gamma
6          2          bravo
7          2          delta

選択クエリを表示したい

UserId  |  Category1           |  Catergory2
----------------------------------------------------------
1            alpha, gamma            charlie, echo
---------------------------------------------------------
2            bravo, delta            hotel
----------------------------------------------------------

つまり、スタッフ列にカテゴリ1またはカテゴリ2のアイテムが含まれているかどうかに基づいて、2つの列が分割されます。これは、上記のように、カテゴリのコンテンツをカンマで区切ることができます。

これがどのように行われるかを示してください

これが理にかなっていることを願っています。

ありがとう

4

2 に答える 2

1

私の試み、Stack Overflowから学んだテクニック!...チェックしてください:

DECLARE @Categoy1 NVARCHAR(MAX) = 'alpha, bravo, delta, gamma',
        @Categoy2 NVARCHAR(MAX) = 'charlie, echo, hotel'
SELECT 
    UserID,      
    STUFF((SELECT  ', ' + display_term
       FROM sys.dm_fts_parser('"'+ ',' + @Categoy1  + '"', 1033, NULL, 0) INNER JOIN 
            YourTable T on display_term=[Stuff]
            WHERE T.UserID= x.UserID
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') Category1,
    STUFF((SELECT  ', ' + display_term
       FROM sys.dm_fts_parser('"'+ ',' + @Categoy2  + '"', 1033, NULL, 0) INNER JOIN 
            YourTable T on display_term=[Stuff]
            WHERE T.UserID= x.UserID
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') Category2
FROM YourTable x
GROUP BY UserID
于 2013-02-05T11:57:09.847 に答える
1

xml拡張機能を使用して文字列を連結し、カテゴリを各サブクエリにハードコーディングすることができます。

CREATE TABLE #T (ID INT, UserID INT, [Stuff] VARCHAR(300))
INSERT #T VALUES
    (1, 1, 'alpha'),
    (2, 2, 'hotel'),
    (3, 1, 'charlie'),
    (4, 1, 'echo'),
    (5, 1, 'gamma'),
    (6, 2, 'bravo'),
    (7, 2, 'delta');

SELECT  UserID,
        [Category1] = STUFF((   SELECT  ', ' + [Stuff]
                                FROM    #T t2
                                WHERE   [Stuff] IN ('alpha', 'bravo', 'delta', 'gamma')
                                AND     t.UserID = t2.UserID
                                FOR XML PATH(''), TYPE
                            ).value('.', 'NVARCHAR(MAX)'), 1, 2, ''),
        [Category2] = STUFF((   SELECT  ', ' + [Stuff]
                                FROM    #T t2
                                WHERE   [Stuff] IN ('charlie', 'echo', 'hotel')
                                AND     t.UserID = t2.UserID
                                FOR XML PATH(''), TYPE
                            ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
FROM    (   SELECT  DISTINCT UserID
            FROM    #T
        ) t

SQLフィドルの例

Categories読みやすさを向上させるために、CTE()で最初にカテゴリを定義できます。

WITH Categories AS
(   SELECT  Category, Name
    FROM    (VALUES
                (1, 'alpha'), 
                (1, 'bravo'), 
                (1, 'delta'), 
                (1, 'gamma'),
                (2, 'charlie'),
                (2, 'echo'), 
                (2, 'hotel')
            ) t (Category, Name)
), Data AS
(   SELECT  UserID, [Stuff], Category
    FROM    T
            INNER JOIN Categories c
                ON c.Name = T.[Stuff]
)
SELECT  UserID,
        [Category1] = STUFF((   SELECT  ', ' + [Stuff]
                                FROM    Data t2
                                WHERE   Category = 1
                                AND     t.UserID = t2.UserID
                                FOR XML PATH(''), TYPE
                            ).value('.', 'NVARCHAR(MAX)'), 1, 2, ''),
        [Category2] = STUFF((   SELECT  ', ' + [Stuff]
                                FROM    Data t2
                                WHERE   Category = 2
                                AND     t.UserID = t2.UserID
                                FOR XML PATH(''), TYPE
                            ).value('.', 'NVARCHAR(MAX)'), 1, 2, '')
FROM    (   SELECT  DISTINCT UserID
            FROM    T
        ) t

SQLフィドルの例

于 2013-02-05T11:35:36.097 に答える