Объединить динамически поворачиваемые столбцы для переменного числа столбцов - PullRequest
0 голосов
/ 08 июля 2019

Мне удалось успешно объединить различные значения полей в отдельные столбцы, но я хочу объединить все эти отдельные (поворотные) столбцы в один столбец.Я не знаю, сколько поворотных столбцов я получаю во время выполнения, поэтому я не могу просто использовать Column1 + Column2 + Column3 и т. Д.

Вот мой sql

--Create a table variable to hold my source data

declare @datatable  table
(
    OrderId             int,
    ProductId           int,
    ClientName          varchar(50)
)

--insert some data
insert into         @datatable values (1, 2, 'Joe Bloggs')
insert into         @datatable values (1, 2, 'Frank Bloggs')

--Create a temp table

--that introduces a new field (called Header)
--to give me column names for my pivoted data

IF OBJECT_ID('tempdb..#PivotedClients') IS NOT NULL DROP TABLE #PivotedClients

create table        #PivotedClients
            (
               OrderId  int,
               ProductId    int,
               ClientName   varchar(50),
               Header   varchar(100)
            )

insert into     #PivotedClients
  select            OrderId,
            ProductId,
            ClientName,
            'Client ' + Cast(Rank() Over (Partition by OrderId                   
  order by ClientName) as varchar(3)) 
  from          @datatable

--Create variables to hold my column names
--and my (dynamic) sql

declare @pivotcolumns       nvarchar(max),
    @colsWithNoNulls    nvarchar(max),
    @sqlquery       nvarchar(max)

set @pivotcolumns = STUFF(
                (
                  select distinct ',' + QUOTENAME(Header)
                  from #PivotedClients
                  for XML PATH (''), TYPE
                        ).value('.', 'nvarchar(max)')
                ,1,1,'')

set @colsWithNoNulls = STUFF(
                  (
                               SELECT DISTINCT ',ISNULL(' + QUOTENAME(Header) + ', '''') ' + QUOTENAME(Header)
                                        FROM #PivotedClients
         for XML PATH (''), TYPE
    ).value('.', 'NVARCHAR(max)')
    ,1,1,''
        )

if OBJECT_ID('tempdb..##Clients ') is not null drop TABLE ##Clients

set @sqlquery = 'select distinct OrderId,
                         ProductID,
                    ' + @colsWithNoNulls + ' 
            into        ##Clients
            from
                (
                   select   OrderId,
                                        ClientName,
                            ProductID,
                        Header
                       from #PivotedClients) x
                pivot 
                (
                   Max(ClientName)
                   for Header in (' + @pivotcolumns + ')
                )   p' 

exec sp_executesql @sqlquery

----
select *
from ##Clients
----

набор записей, который у меня в настоящее время заканчивается:

OrderId ProductId  Client1       Client 2
1       2          Frank Bloggs  Joe Blogs

То, что я хочу, это:

OrderID ProductId Clients
1       2         Frank Bloggs Joe Bloggs

Я не знаю, сколько «поворотных» столбцов у меня закончитсяво время выполнения, поэтому я не могу просто использовать Client1 + Client2 и т. д.

1 Ответ

0 голосов
/ 08 июля 2019

Просто нужно изменить @colsWithNoNulls для выполнения конкатенации строк

set @colsWithNoNulls = STUFF(
                (
                    SELECT  DISTINCT '+ '' '' +  ISNULL(' + QUOTENAME(Header) + ', '''')' 
                                        FROM    #PivotedClients
                    for XML PATH (''), TYPE
                ).value('.', 'NVARCHAR(max)')
                , 1, 1, '') + 'AS Clients'

Также вы можете сделать print @sqlquery до sp_executesql. это поможет вам отладить ваш динамический запрос

...