2016-02-03 15 views
6

ich eine Tabelle wie folgt aus:Wie in schwenk benutzerdefinierten Namen Spalte zur Verfügung zu stellen

id unit 
1 mm 
2 cm 
3 kg 

Wenn ich Pivotisierungsoperation auf diese auszuführen, erhalte ich Ergebnis wie folgt:

1 2 3 
mm cm kg 

es ist hier möglich benutzerdefinierte Spaltennamen zu bekommen, so etwas wie dieses:

d1 d2 d3 
mm cm kg 

ich Pivot für diese wie bin mit:

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 

Ist es möglich? Danke

Antwort

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

Perfekt !!! Vielen Dank!! –

+0

@omkar patade Sie sind herzlich willkommen;) – Devart

2

Fügen Sie Ihrer ID einfach ein Präfix hinzu. Beispiel

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

Es ist auch schrecklich, globale temporäre Tabellen zu verwenden! Vor allem eines mit dem Namen ## Temp

+0

Ja, es war nur ein praktisches Beispiel. Aus diesem Grund habe ich die globale Tempentabelle verwendet. Bezüglich der Antwort funktioniert es nicht. Gibt noch 1,2 .. als Spaltennamen –

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

Sie einen CASE Ausdruck mit einer dynamischen SQL-Abfrage verwenden kann.

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); 

Ergebnis

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

Yup es funktioniert! –

Verwandte Themen