SQL Pivot для текстовых столбцов, возвращающих несколько строк - PullRequest
1 голос
/ 29 ноября 2011

Я прошел через кучу примеров и других вопросов на SO, но я все еще возникают проблемы с этим стержнем.

select [Address],[Address 1],[Address 2],[Address2],[Birth Day],[City],
       [Email],[First Name],[Last Name],[Phone],[State],[Zip]
from 
(SELECT *, row_number() over(PARTITION by formid order by formid) as rnk   
 FROM [Sitecore_WebForms].[dbo].[Field] 
 where FormId='C9681226-5951-403D-80A0-00019218785C'
) as SourceTable
pivot
(
max(value)
for [fieldname] in 
([Address],[Address 1],[Address 2],[Address2],[Birth Day],[City],[Email],
 [First Name],[Last Name],[Phone],[State],[Zip])
) as pt

Результат возвращается с 9 строками, по 1 строке для каждого столбца.Как получить объединить эти строки в одну строку?

Address Address 1   Address 2   Address2    Birth Day   City    Email   First Name  Last Name   Phone   State   Zip
NULL    NULL    NULL    NULL    NULL    NULL    NULL    FIRS    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    CITY    NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    LAST    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    ZIP
ADDR    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    DATE    NULL    NULL    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    EMAI    NULL    NULL    NULL    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    PHON    NULL    NULL
NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL    NULL

исходные строки

Id  FieldId FormId  Value   Data    FieldName
CE160D15-EBCC-45B6-AB67-0CCA4AA081C7    09C0317E-E235-469D-AE7E-6CB9C45916EA    C9681226-5951-403D-80A0-00019218785C    FIRS        First Name
393E6220-8CC8-4B4E-A75B-29E1801A9A65    2ED6CAC8-7210-4BBC-9497-3B0E8A5F7CF7    C9681226-5951-403D-80A0-00019218785C    LAST        Last Name
64F9A694-406E-4385-932E-2D0D68A17FB7    FA5C1C21-CCFC-4E96-A1D8-57AC7B1AEF2C    C9681226-5951-403D-80A0-00019218785C    ADDR        Address
960A2BB5-0B50-4640-8EC8-170677809E64    CA9184AE-99CD-46C0-A72D-47FBD4F768AB    C9681226-5951-403D-80A0-00019218785C    CITY        City
CD954912-B24A-4726-9729-2ACD6DDD00C9    E695546B-2BBA-4AFF-9DAF-1B5666E42C74    C9681226-5951-403D-80A0-00019218785C    ZIP         Zip
FD19C907-F779-4CF8-90B7-4E072CDE36BE    DF056320-27BD-4E15-BF73-AC0C4A1CF543    C9681226-5951-403D-80A0-00019218785C    DATE        Birth Day
497AC034-6686-4023-ADE9-CB825F65DBFE    06807268-1689-4DDF-BDE2-08FBA31E56AE    C9681226-5951-403D-80A0-00019218785C    PHON        Phone
8A438C22-9C8E-4759-998F-542917408E38    D9402E5E-09CE-40E6-86F7-D80D99417208    C9681226-5951-403D-80A0-00019218785C    EMAI        Email

Ответы [ 2 ]

4 голосов
/ 30 ноября 2011

Если мы выберем только значение и имя_файла из источника, оно будет работать как положено.

select [Address],[Address 1],[Address 2],[Address2],[Birth Day],[City],
       [Email],[First Name],[Last Name],[Phone],[State],[Zip]
from 
(SELECT value, fieldname   
 FROM [Sitecore_WebForms].[dbo].[Field] 
 where FormId='C9681226-5951-403D-80A0-00019218785C'
) as SourceTable
pivot
(
max(value)
for [fieldname] in 
([Address],[Address 1],[Address 2],[Address2],[Birth Day],[City],[Email],
 [First Name],[Last Name],[Phone],[State],[Zip])
) as pt

Обновление для всех форм:

DECLARE @form TABLE 
( 
    id INT, 
    formid INT,
    fieldName VARCHAR(32),
    fieldValue VARCHAR(32)
)

insert into @form values(1,1,'First Name','FRST')
insert into @form values(2,1,'Last Name','LST')
insert into @form values(3,1,'Address','ADDR')
insert into @form values(4,2,'First Name','FRST2')
insert into @form values(5,2,'Last Name','LST2')
insert into @form values(6,2,'Address','ADDR2')



select FormId,[Address],[Address 1],[Address 2],[Address2],[Birth Day],[City],
       [Email],[First Name],[Last Name],[Phone],[State],[Zip]
from 
(SELECT FormId,fieldName,fieldValue
 FROM @form 
 --where FormId=1
) as SourceTable
pivot
(
max(fieldValue)
for [fieldname] in 
([Address],[Address 1],[Address 2],[Address2],[Birth Day],[City],[Email],
 [First Name],[Last Name],[Phone],[State],[Zip])
) as pt
1 голос
/ 30 ноября 2011

PIVOT будет «вращать» только те столбцы, которые вы перечислите;любые другие столбцы все еще будут копировать свой собственный ряд.В вашем случае и Id, и FieldId приведут к тому, что каждая строка останется.

Чтобы решить эту проблему, исключите эти столбцы в подзапросе:

select  *
from    (
        select  FormId
        ,       Value
        ,       FieldName 
        from    @t 
        ) as SourceTable        
pivot   (
        max(value) 
        for FieldName in 
        (Address,[Address 1],[Address 2],Address2,...)
        ) as PivotAlias;

Рабочий примерна SE DATA.

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