2017-11-13 2 views
0

Mai Some One Bitte helfen Sie mir, wie die folgende Ausgabe erhalten. SQL Server 2008Pivot für dynamische Spalte Wert

CREATE TABLE #TABLE 
(
[Generic Name] varchar(15), 
[Description]varchar(15) 
) 

INSERT #TABLE 

SELECT 'RESISTOR', 'POWER' UNION ALL 
SELECT 'RESISTOR', 'Type' UNION ALL 
SELECT 'RESISTOR', 'DESIGN' UNION ALL 
SELECT 'RESISTOR', 'Material' 

Ergebnis für jede Generic Name, Design, Material, andere, Macht und TYPE als Wert der Spalte unter Spaltenname als Desc1, Desc2 .... descn

**Generic Name DESC1 ,DESC2 ,DESC2, DESC4 
RESISTOR  POWER , Type DESIGN, Material** 

Antwort

1

Hier ist, wie es dynamicly zu tun:

CREATE TABLE T1 
(
[Generic Name] varchar(15), 
[Description]varchar(15) 
) 

INSERT T1 

SELECT 'RESISTOR', 'POWER' UNION ALL 
SELECT 'RESISTOR', 'Type' UNION ALL 
SELECT 'RESISTOR', 'DESIGN' UNION ALL 
SELECT 'RESISTOR', 'Material'; 



DECLARE @Cols NVARCHAR(MAX); 
DECLARE @SQL NVARCHAR(MAX); 
DECLARE @Sel NVARCHAR(MAX); 

SET @Cols = STUFF((SELECT distinct ',' + QUOTENAME(T1.Description) 
      FROM T1 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,''); 
SET @Sel = STUFF((SELECT distinct ',' + QUOTENAME(T1.Description) + ' AS DESC'+CAST(row_number() over (order by (Description)) as varchar(10)) 
      FROM T1 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,''); 



SET @SQL = N' 
SELECT [Generic Name], '+ @Sel+ N' 
FROM T1 
    pivot 
    (
      MAX(Description) For Description IN ('+ @Cols + N') 
     ) P'; 

EXECUTE(@SQL); 

Ergebnisse:

+--------------+--------+----------+-------+-------+ 
| Generic Name | DESC1 | DESC2 | DESC3 | DESC4 | 
+--------------+--------+----------+-------+-------+ 
| RESISTOR  | DESIGN | Material | POWER | Type | 
+--------------+--------+----------+-------+-------+ 

Demo

0

Versuchen Sie, die folgende Antwort, hoffen, dass es hilft Ihnen:

CREATE TABLE #TABLE 
(
[Generic Name] varchar(15), 
[Description]varchar(15) 
) 

INSERT INTO #TABLE 

SELECT 'RESISTOR', 'POWER' UNION ALL 
SELECT 'RESISTOR', 'Type' UNION ALL 
SELECT 'RESISTOR', 'DESIGN' UNION ALL 
SELECT 'RESISTOR', 'Material' 

SELECT MAX(CASE WHEN RN=1 THEN [Generic Name] END)[Generic Name] 
    ,MAX(CASE WHEN RN=1 THEN [Description] END)DESC1 
    ,MAX(CASE WHEN RN=2 THEN [Description] END)DESC2 
    ,MAX(CASE WHEN RN=3 THEN [Description] END)DESC3 
    ,MAX(CASE WHEN RN=4 THEN [Description] END)DESC4 
FROM(
    SELECT *,ROW_NUMBER() OVER(ORDER BY (SELECT NULL))RN from #TABLE 
    )D 

DROP TABLE #TABLE 

Ergebnis:

Generic Name DESC1 DESC2 DESC3 DESC4 
RESISTOR  POWER Type DESIGN Material 
+0

Die folgende Lösung eignen sich gut für Know Anzahl von Werten wie Design, Material .. .etc, ich habe 5000 solcher Werte jede Möglichkeit, es dynamisch zu erstellen. – akhrot

0

Sie können auch PIVOT Aussage

CREATE TABLE #TABLE 
(
[Generic Name] varchar(15), 
[Description]varchar(15) 
) 

INSERT #TABLE 

SELECT 'RESISTOR 1', 'POWER' UNION ALL 
SELECT 'RESISTOR 1', 'Type' UNION ALL 
SELECT 'RESISTOR 1', 'DESIGN' UNION ALL 
SELECT 'RESISTOR 1', 'Material' UNION ALL 

SELECT 'RESISTOR 2', 'POWER' UNION ALL 
SELECT 'RESISTOR 2', 'Type' UNION ALL 
SELECT 'RESISTOR 2', 'DESIGN 1' UNION ALL 
SELECT 'RESISTOR 2', 'DESIGN 2' UNION ALL 
SELECT 'RESISTOR 2', 'Material' 

-- variant 1 
SELECT * 
FROM 
    (
    SELECT *,ROW_NUMBER()OVER(PARTITION BY [Generic Name] ORDER BY [Description]) RowNum 
    FROM #TABLE 
) q PIVOT(MAX([Description]) FOR RowNum IN([1],[2],[3],[4],[5])) p 

-- variant 2 
SELECT * 
FROM #TABLE PIVOT(MAX([Description]) FOR [Description] IN([POWER],[Type],[DESIGN],[DESIGN 1],[DESIGN 2],[Material])) p 

DROP TABLE #TABLE 

Aber Sie müssen wissen, verwenden, wie viele Spalten Ihr Ergebnis enthalten. SQL unterstützt keine dynamische Anzahl von Spalten.

Verwandte Themen