2016-02-03 19 views
6

Ho una tabella come questa:Come fornire nome personalizzato alla colonna girevole

id unit 
1 mm 
2 cm 
3 kg 

Quando si esegue un'operazione perno su questo, sto ottenendo il seguente risultato:

1 2 3 
mm cm kg 

E ' possibile ottenere i nomi di colonna personalizzata qui, qualcosa di simile:

d1 d2 d3 
mm cm kg 

sto usando Pivot per questo come:

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

CREATE table #t 
(id varchar(max),unit varchar(max)) 
insert into #t (id,unit)values 
(1,'kg'), 
(2,'cm'), 
(3,'mm'), 
(4,'m') 

DECLARE @statement NVARCHAR(max) 
    ,@columns NVARCHAR(max) 

SELECT @columns = ISNULL(@columns + ',', '') + N'[' + cast(tbl.id as varchar(max)) + ']' 
    FROM (
    SELECT DISTINCT id 
    FROM #t 
    ) AS tbl 

    SELECT @statement = 'select * 
        INTO ##temp 
        from (
        SELECT id,[unit] 
        FROM #t 
        ) as s 
PIVOT 
(max(unit) FOR id in(' + @columns + ')) as pvt 
' 


EXEC sp_executesql @statement = @statement 




SELECT * FROM ##temp 
DROP TABLE #t 
DROP TABLE ##temp 

È possibile? Grazie

risposta

3
IF OBJECT_ID('tempdb..#t') IS NOT NULL 
    DROP TABLE #t 
GO 

CREATE TABLE #t (
    id VARCHAR(10), 
    unit VARCHAR(100) 
) 
INSERT INTO #t (id, unit) 
VALUES 
    ('1', 'kg'), 
    ('2', 'cm'), 
    ('3', 'mm'), 
    ('4', 'mm') 

DECLARE @SQL NVARCHAR(MAX), @columns NVARCHAR(MAX) 

SELECT @columns = STUFF((
    SELECT ',[D' + id + ']' 
    FROM #t 
    FOR XML PATH('')), 1, 1, '') 

SELECT @SQL = ' 
    SELECT * 
    FROM (
     SELECT [unit], col = N''D'' + id 
     FROM #t 
    ) s 
    PIVOT (MAX(unit) FOR col IN (' + @columns + ')) p' 

EXEC sys.sp_executesql @SQL 
+0

Perfetto !!! Grazie mille!! –

+0

@omkar patade siete i benvenuti;) – Devart

2

Basta aggiungere un prefisso al tuo ID. Esempio

SELECT @statement = 'select * INTO ##temp from 
        (SELECT [id] = ''d''+id,[unit] FROM #t) as s 
        PIVOT 
        (max(unit) FOR id in(' + @columns + ')) as pvt ' 

Inoltre è una pratica terribile utilizzare le tabelle temporali globali! In particolare uno chiamato ## Temp

+0

sì, era solo un esempio di pratica. Ecco perché ho usato la tabella temporanea globale. Per quanto riguarda la risposta, non funziona. Ancora dà 1,2 .. come nomi delle colonne –

0
SELECT @statement = 'select * INTO ##temp from (SELECT ''d''+id AS [id],[unit] FROM #t) as s PIVOT (max(unit) FOR id in(' + @columns + ')) as pvt ' 
1

È possibile utilizzare un'espressione CASE con una query SQL dinamico.

CREATE TABLE #t 
(
    id INT, 
    unit VARCHAR(2) 
); 

INSERT INTO #t VALUES 
(1,'mm'), 
(2,'cm'), 
(3,'kg'); 

DECLARE @query AS VARCHAR(MAX); 

SELECT @query = 'SELECT ' + 
     STUFF 
     (
     (
      SELECT DISTINCT ',MAX(CASE WHEN id = '+ CAST(id AS VARCHAR(10)) 
       + ' THEN unit END) AS d' + CAST(id AS VARCHAR(10)) 
      FROM #t 
      FOR XML PATH('') 
     ), 
     1,1,''); 
SELECT @query += ' FROM #t;'; 

EXECUTE(@query); 

Risultato

+----+----+----+ 
| d1 | d2 | d3 | 
+----+----+----+ 
| mm | cm | kg | 
+----+----+----+ 
+0

Yup its working! –