Работа по группам для группировки данных в строковый формат - PullRequest
0 голосов
/ 20 мая 2010

У меня есть таблица, которая содержит некоторые данные, приведенные ниже. Он использует древовидную структуру

т.е.

                Department

     SubD1,                       SubD2 .....

PreSubD1, PreSubD1...       PreSubD2, PreSubD2...       

pk_map_id            preferences          ImmediateParent      Department_Id
-------------------- -------------------- -------------------- --------------------
20                   14                   5                    1
21                   15                   5                    1
22                   16                   6                    1
23                   9                    4                    2
24                   4                    3                    2
25                   24                   20                   2
26                   25                   20                   2
27                   23                   13                   2

Я хочу сгруппировать свои записи от имени департамента, затем непосредственного родителя, затем предпочтения, каждый из которых разделен ','

т.е.

department  Immediate Parent  preferences
1             5,6                 14,15,16
2             4,3,20,13           9,4,24,25,23

and this table also

Immediate parent  preferences
5                     14,15
6                     16
4                     9
3                     4
20                    24,25
13                    13

В реальном сценарии все это мои идентификаторы, которые должны быть заменены их строковыми полями.

Я использую SQL-сервер 2k5

1 Ответ

2 голосов
/ 20 мая 2010

Вы можете использовать FOR XML PATH в подзапросе, чтобы получить список значений через запятую. Затем вы группируете свое ключевое поле, чтобы получить его для правильных значений.

Для вашего первого запроса

SELECT
    [Department_Id],
    STUFF(
    (
        SELECT
            ',' + CONVERT(varchar(10), [ImediateParent])
        FROM
            [YourTable] [YourTable2]
        WHERE
            [YourTable2].[Department_Id] = [YourTable].[Department_Id]
        FOR XML PATH('')
    ), 1, 1, ''),
    STUFF(
    (
        SELECT
            ',' + CONVERT(varchar(10), [Preferences])
        FROM
            [YourTable] [YourTable2]
        WHERE
            [YourTable2].[Department_Id] = [YourTable].[Department_Id]
        FOR XML PATH('')
    ), 1, 1, '')
FROM
    [YourTable]
GROUP BY
    [YourTable].[Department_Id]

и для вашего второго запроса

SELECT
    [ImediateParent],
    STUFF(
    (
        SELECT
            ',' + CONVERT(varchar(10), [Preferences])
        FROM
            [YourTable] [YourTable2]
        WHERE
            [YourTable2].[ImediateParent] = [YourTable].[ImediateParent]
        FOR XML PATH('')
    ), 1, 1, '')
FROM
    [YourTable]
GROUP BY
    [YourTable].[ImediateParent]
...