2016-06-27 2 views
0

Во второй половине дня все,Sql кронштейн горизонтального

Пытаясь выяснить, как поворачиваться без агрегата, поскольку есть буквенно-цифровые значения. Есть ли еще один термин для этого?

Heres данные, которые у меня есть:

Id   Name 
1Bravo  John 
1Bravo  Smith 
2Charlie Dave 
2Charlie Billy 

То, что я хочу добиться:

Id  Name Name 
1Bravo John Smith 

Для отображения результатов с Bravo в нем

Я действительно не получили в любом месте с шарниром

Select ID, Name 
From Table 
Pivot (
Max(ID) For ID Like ('Bravo%') 

Любая помощь приветствуется

Благодаря

+0

будет всегда два имени на 'ID' –

+0

nah не всегда, это был всего лишь пример. ID может иметь x количество имен. Извините, должен был указать, что – aofe1337

+0

так что ожидаемый результат, когда id имеет X количество имен? – TheGameiswar

ответ

-1

Вы должны сначала ограничить ваше максимальное количество имен (я установил 10 имен в запросе), а затем вы можете повернуть его.

Я добавил столбец с общим количеством имен в строке (cnt) для простого цикла или проверки без необходимости поиска первого нулевого имени.

;with 
YourTable as (
    select * 
    from ( 
    values 
     ('1Bravo',  'John'), 
     ('1Bravo',  'Smith'), 
     ('2Charlie', 'Dave'), 
     ('2Charlie', 'Billy') 
    ) t (Id, Name) 
), 
n as (
    select id, count(distinct name) cnt 
    from YourTable 
    group by id 
), 
x as (
    select *, ROW_NUMBER() over (partition by id order by name) idx 
    from YourTable 
) 
select n.cnt, p.* 
from x 
pivot (min(name) for idx in ([1],[2],[3],[4],[5],[6],[7],[8],[9],[10])) p 
inner join n on n.Id = p.Id 

Вы можете фильтровать желаемые ID

where n.id like '%bravo%' 

Я надеюсь, что это помогает

+0

хотел бы знать причину, чтобы отметить мой ответ «не полезно», – MtwStark

0

Это будет строить запрос динамически на основе количества имен для данного Id.

--Create Sample Data 
CREATE TABLE myTable 
    ([Id] varchar(8), [Name] varchar(5)) 
; 
INSERT INTO myTable 
    ([Id], [Name]) 
VALUES 
    ('1Bravo', 'John'),('1Bravo', 'Smith'),  
    ('2Charlie', 'Dave'),('2Charlie', 'Billy'),('2Charlie', 'Bobby') 
; 


DECLARE @Id VARCHAR(8) = '1Bravo', 
     @Sql NVARCHAR(MAX), 
     @SelCols NVARCHAR(MAX), 
     @PivCols NVARCHAR(MAX) 

--Build Select and Pivot columns dynamically based on the number of Names for the given @Id 
SELECT @SelCols = COALESCE(@SelCols + ',','') + QUOTENAME(ROW_NUMBER() OVER (ORDER BY [Name])) + ' As [Name]', 
     @PivCols = COALESCE(@PivCols + ',','') + QUOTENAME(ROW_NUMBER() OVER (ORDER BY [Name])) 
FROM myTable 
WHERE [Id] = @Id 


--Build the dynamic sql 
SET  @Sql = 'SELECT [Id], ' + @SelCols + ' 
       FROM ( SELECT [Id], [Name], ROW_NUMBER() OVER (PARTITION BY [Id] ORDER BY [Name]) Rn 
         FROM myTable 
         WHERE [Id] = @Id) mt 
       PIVOT (
        MAX([Name]) 
        FOR Rn IN (' + @PivCols + ')) p' 

--Execute the dynamic sql passing in the @Id parameter 
EXECUTE sp_executesql @Sql, N'@Id VARCHAR(8)', @Id = @Id 

[email protected] = '1Bravo` result 
--Id  Name Name 
---------- ----- ----- 
--1Bravo John Smith 

[email protected] = '2Charlie` result 
--Id  Name Name Name 
---------- ----- ----- ----- 
--2Charlie Billy Bobby Dave