2009-06-19 2 views
1

У меня есть необходимость запроса «запустить один раз» (так что производительность не столь критична) с использованием таблиц, аналогичных этим (упрощенные варианты фактического):SQL Server «группа по» каскадной запроса

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 и temp; Я просто показываю их для ясности. Вы можете удалить "#", чтобы постоянные таблицы ...

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

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) 

благодаря ...

ответ

1

Использование 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 
0

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

Смежные вопросы