2017-02-15 1 views
0

Вот мой запрос хранимой процедуры для извлечения данных в первой таблице.Скрыть дублирующее значение строки в столбец с помощью сводной таблицы

SELECT [Item] = t3.Item, 
[Name] = t2.Name, 
[Value] = t1.value 

INTO #Result 

FROM table1 t1 
INNER JOIN table2 t2 ON t2.IsDeleted = 0 
INNER JOIN table3 t3 ON t3.IsDeleted = 0 AND t3.Item_ID = @Id 
WHERE t1.Item_ID = @Id 

GROUP BY 
t1.value, 
t2.Name, 
t3.Item 

У меня следующие данные в таблице темп.

| Item | Name | Value | 
-------------------------- 
| item1 | Name 1 | 2 | 
| item2 | Name 1 | 4 | 
| item3 | Name 1 | 5 | 
| item1 | Name 2 | 6 | 
| item2 | Name 2 | 3 | 
| item3 | Name 2 | 1 | 
| item1 | Name 3 | 7 | 
| item2 | Name 3 | 4 | 
| item3 | Name 3 | 2 | 

Хочу Имя 1, имя 2, 3, как имя столбца, и их value против соответствующего item.Data в таблице dynamic.There может быть любое количество Items и любое количество Name. Для каждого Name и Item их значение представляет собой одноразрядное число. Items одинаковы для каждого Name Спасибо

Мне нужно что-то вроде ниже.

| Item | Name 1 | Name 2 | Name 3| 
------------------------------------ 
| item1 | 2 | 6 | 7 | 
| item2 | 4 | 3 | 4 | 
| item3 | 5 | 1 | 2 | 
+0

Почему хранимая процедура тега? – jarlh

+0

Может использоваться GROUP BY. Будет работать со всеми продуктами dbms. – jarlh

+0

Как мне нужно использовать его в Хранимой процедуре. Если вы хотите, я могу опубликовать свою хранимую процедуру. –

ответ

0

Это хорошо работает для меня. :)

IF OBJECT_ID('TEMPDB.dbo.##FinalResult ') IS NOT NULL DROP TABLE ##FinalResult 

DECLARE @DynamicPivotQuery AS NVARCHAR(MAX) 
DECLARE @ColumnName AS NVARCHAR(MAX) 

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
     + QUOTENAME([Name])  
FROM (SELECT DISTINCT [Name] FROM #Result) AS ##FinalResult 

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
    N'SELECT [Item], ' + @ColumnName + ' 
    INTO ##FinalResult 
    FROM #Result 
    PIVOT(MAX([Value]) 
    FOR [Name] IN (' + @ColumnName + ')) AS PVTTable' 
--Execute the Dynamic Pivot Query 
EXEC sp_executesql @DynamicPivotQuery 

SELECT * FROM ##FinalResult 
0

Использование pivot

declare @T table 
(
    item varchar(5), 
    name varchar(6), 
    value smallint 
) 

insert into @T 
select 'item1' , 'Name 1' , 2 union 
select 'item2' , 'Name 1' , 4 union 
select 'item3' , 'Name 1' , 5 union 
select 'item1' , 'Name 2' , 6 union 
select 'item2' , 'Name 2' , 3 union 
select 'item3' , 'Name 2' , 1 union 
select 'item1' , 'Name 3' , 7 union 
select 'item2' , 'Name 3' , 4 union 
select 'item3' , 'Name 3' , 2 

select * 
from 
(
    select * from @T 
) p 
pivot 
(
    sum(value) for name in ([Name 1], [Name 2], [Name 3]) 
) pvt 

Если имена не являются постоянными и могут отличаться, вы должны создать динамический SQL-запрос (here вы можете найти пример динамического запроса).

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