SQL Server «группировать по» каскадный запрос - PullRequest
1 голос
/ 19 июня 2009

Мне нужен запрос «один раз» (поэтому производительность не столь критична) с использованием таблиц, подобных этим (упрощенные версии фактических данных):

CREATE TABLE #Items
(    ItemPK               int            not null  primary key
    ,ItemDescription      varchar(25)    not null
)

INSERT INTO #Items VALUES (1,'rock')
INSERT INTO #Items VALUES (2,'wood')
INSERT INTO #Items VALUES (3,'plastic')

CREATE TABLE #ItemTypes
(    ItemType             char(1)        not null   primary key
    ,ItemTypeDescription  varchar(25)    not null
)

INSERT INTO #ItemTypes VALUES ('A','Type A')
INSERT INTO #ItemTypes VALUES ('B','BBBBB')
INSERT INTO #ItemTypes VALUES ('C','Color')

CREATE TABLE #ItemInfo
(    InfoPK               int            not null   primary key   identity(1,1)
    ,ItemPK               int            not null   foreign key references #ListOfItems.ItemPK
    ,ItemType             char(1)        not null   foreign key references #ItemTypes.ItemType
    ,ItemValue            varchar(10)    not null
)

INSERT INTO #ItemInfo VALUES (1,'A','hard')
INSERT INTO #ItemInfo VALUES (1,'A','natural')
INSERT INTO #ItemInfo VALUES (1,'B','cold')
INSERT INTO #ItemInfo VALUES (1,'C','gray')
INSERT INTO #ItemInfo VALUES (2,'B','grain')
INSERT INTO #ItemInfo VALUES (2,'B','brown')
INSERT INTO #ItemInfo VALUES (3,'A','flexible')
INSERT INTO #ItemInfo VALUES (3,'A','colorful')
INSERT INTO #ItemInfo VALUES (3,'A','unnatural')
INSERT INTO #ItemInfo VALUES (3,'C','waterproof')

Вы получите предупреждения о FK и временных таблицах; Я просто показываю их для ясности. Вы можете удалить "#", чтобы создать постоянные таблицы ...

Когда я запускаю этот запрос:

SELECT
    i.ItemDescription
        ,t.ItemTypeDescription
        ,o.ItemValue
    FROM #Items                    i
        LEFT OUTER JOIN #ItemInfo  o ON i.ItemPK=o.ItemPk
        LEFT OUTER JOIN #ItemTypes t ON o.ItemType=t.ItemType

Я получаю этот вывод:

ItemDescription           ItemTypeDescription       ItemValue
------------------------- ------------------------- ----------
rock                      Type A                    hard
rock                      Type A                    natural
rock                      BBBBB                     cold
rock                      Color                     gray
wood                      BBBBB                     grain
wood                      BBBBB                     brown
plastic                   Type A                    flexible
plastic                   Type A                    colorful
plastic                   Type A                    unnatural
plastic                   Color                     waterproof

Однако мне нужен вывод:

ItemDescription           CombinedDescription
------------------------- -----------------------------------------------
rock                      Type A: hard, natural; BBBBB: cold; Color: gray
wood                      BBBBB: grain, brown
plastic                   Type A: flexible, colorful, unnatural; Color: waterproof


(3 row(s) affected)

спасибо ...

Ответы [ 3 ]

1 голос
/ 19 июня 2009

Используя трюк XML, это должно сделать это:

SELECT      i.ItemDescription,
            (SELECT x.ItemTypeDescription + ': ' + x.vals + 
                CASE WHEN (ROW_NUMBER() OVER (ORDER BY x.ItemType DESC) = 1) THEN '' ELSE '; ' END
                FROM  ( SELECT  DISTINCT
                                ii.ItemPK,
                                t.ItemTypeDescription,
                                ii.ItemType,
                        (SELECT         x.ItemValue + 
                                        CASE WHEN (ROW_NUMBER() OVER (ORDER BY x.ItemValue DESC) = 1) THEN '' ELSE ', ' END
                            FROM        #ItemInfo x
                            WHERE       x.ItemPK = ii.ItemPK
                                    AND x.ItemType = ii.ItemType
                            ORDER BY    x.ItemValue
                            FOR XML PATH('')
                        ) AS VALS
                FROM    #ItemInfo ii
                JOIN    #ItemTypes t
                    ON  ii.ItemType = t.ItemType
                ) x
                WHERE       x.ItemPK = i.ItemPK
                ORDER BY    x.ItemType
                FOR XML PATH('')
            ) AS CombinedDescription

FROM        #Items i
1 голос
/ 19 июня 2009

Различные варианты объединения строк в SQL Server были обобщены Анитом Сеном в этом посте: http://www.simple -talk.com / sql / t-sql-программирования / concatenating-row-values-in- Transact-SQL /

Обычно лучшим вариантом является трюк с XML PATH.

0 голосов
/ 19 июня 2009

вы можете написать функцию скалярного значения, которая будет содержать подзапрос, в котором она будет выполнять конкатенацию, или вы можете попробовать объединить, пример здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...