Как развернуть простые повторяющиеся данные в SQL 2005 типа Text - PullRequest
0 голосов
/ 29 апреля 2010

Я провел некоторый поиск и нашел информацию о том, как поворачивать числа и суммировать их, но я не видел, где можно поворачивать текст.

Упрощенно, у нас есть таблица, которая выглядит примерно так ...

PlanID    AreaAbbrev    AreaDescription    GoalText
10133     Rec           Recreation         Johnny is good at...
10133     Community     Community Part     Johnny is currently going...
10133     Employment    Employment         Johnny is currently employed at...
10144     Rec           Recreation         Sammy is good at...
10144     Community     Community Part     Sammy is currently going...
10144     Employment    Employment         Sammy is currently employed at...

Вы можете видеть, что всегда есть три различных AreaAbbrev, и они повторяются. И вы можете видеть, что GoalText может быть длинным и всегда другим.

Вот как бы мне хотелось, чтобы новый Select выглядел.

PlanID    Recreation            Community Part                Employment
10133     Johnny is good at..   Johnny is currently going...  Johnny is currently employeed at...
10144     Sammy is good at..    Sammy is currently going...   Sammy is currently employed at...

Извините за все тире ... Я попробовал 4 или 5 разных способов отображения этих таблиц, и это было все, что я мог решить. Мне пришлось использовать тире в качестве пробелов, чтобы выровнять их.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 24 июля 2012

Как было указано в другом ответе, вы можете использовать PIVOT. Но если у вас нет известного количества записей для преобразования, вы можете использовать динамический PIVOT.

См. Скрипка SQL с демонстрацией

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.areadescription) 
            FROM t c
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')


set @query = 'SELECT planid, ' + @cols + ' from 
            (
                select planid, areadescription, goaltext
                from t
           ) x
            pivot 
            (
                min(goaltext)
                for areadescription in (' + @cols + ')
            ) p '


execute(@query)
0 голосов
/ 30 апреля 2010
Функция

Pivot всегда нуждается в функции Agregate для работы. Поэтому, поскольку вы не можете использовать SUM или AVG, вы можете использовать MIN или MAX.

Итак, вот кусок кода, чтобы получить то, что вы хотите.

SELECT PlanId, [Recreation], [Community party], [Employment]
FROM 
(SELECT PlanId, AreaDescription, GoalText
FROM dbo.TempArea) p
PIVOT
(
MAX (GoalText)
FOR AreaDescription IN
( [Recreation], [Community party], [Employment] )
) AS pvt
ORDER BY PlanId
...