2009-06-17 5 views
-2

Input:Spalte Eintrag in SQL

 
Name   Id 

N1   1 
N1   3 
N1   4 
N1   7 
N2   2 
N2   1 
N2   8 
N2   5 
N3   4 
N3   8 
N3   5 
N3   3 
N4   7 
N4   7 
N4   7 
N4   8 

Ausgang:

 
Name1 Name2 Name3 Name4 
----------------------- 
    N1 N2 N3  N4 
    1 2 4  7 
    3 1 8  7 
    4 8 5  7 
    7 5 3  8 

Hilfe bitte

+0

OP hat eine schreckliche Haltung, siehe Kommentar unten. Bitte schließe. –

Antwort

2

Ich denke, Ihr Problem nicht gut definiert ist, aber hier ist eine Lösung:

--CREATE TABLE so1008354 (
-- Name1 VARCHAR(10) 
-- ,Name2 VARCHAR(10) 
-- ,Name3 VARCHAR(10) 
-- ,Name4 VARCHAR(10) 
--) 
-- 
--INSERT INTO so1008354 (Name1, Name2, Name3, Name4) VALUES ('N1', 'N2', 'N3', 'N4') 
--INSERT INTO so1008354 (Name1, Name2, Name3, Name4) VALUES ('1', '2', '4', '7') 
--INSERT INTO so1008354 (Name1, Name2, Name3, Name4) VALUES ('3', '1', '8', '7') 
--INSERT INTO so1008354 (Name1, Name2, Name3, Name4) VALUES ('4', '8', '5', '7') 
--INSERT INTO so1008354 (Name1, Name2, Name3, Name4) VALUES ('7', '5', '3', '8') 

SELECT * 
FROM so1008354 

-- 
; 
WITH unpvt 
      AS (SELECT col1, 
         col2 
       FROM  so1008354 UNPIVOT (col2 FOR col1 IN ([Name1], [Name2], [Name3], [Name4])) AS unpvt 
      ) , 
     XLate 
      AS (SELECT col1 AS NameList_pre, 
         col2 AS NameList 
       FROM  unpvt 
       WHERE col2 LIKE 'N%' 
      ) , 
     Data 
      AS (SELECT col1 AS NameList_pre, 
         col2 AS Tokens 
       FROM  unpvt 
       WHERE col2 NOT LIKE 'N%' 
      ) 
    SELECT XLate.NameList, 
      Data.Tokens 
    FROM Data 
      INNER JOIN XLate ON XLate.NameList_pre = Data.NameList_pre 
    ORDER BY XLate.NameList, 
      Data.Tokens 

Welche Ergebnisse gibt:

Name1  Name2  Name3  Name4 
---------- ---------- ---------- ---------- 
N1   N2   N3   N4 
1   2   4   7 
3   1   8   7 
4   8   5   7 
7   5   3   8 

(5 row(s) affected) 

NameList Tokens 
---------- ---------- 
N1   1 
N1   3 
N1   4 
N1   7 
N2   1 
N2   2 
N2   5 
N2   8 
N3   3 
N3   4 
N3   5 
N3   8 
N4   7 
N4   7 
N4   7 
N4   8 

(16 row(s) affected) 
0

Sie können nicht tun, weil nach den Microsoft-Hilfe-Dokumente:

: : = (aggregate_function (value_column) Für pivot_column IN() )

Wenn Sie also keine Aggregatfunktion ausführen, erhalten Sie mit der Pivot-Funktion nicht nur einen Drehpunkt der Spalte.

Sie können jedoch ein Pivot der oben genannten Daten mit einer normalen Select- und einer Case-Anweisung ausführen.

+0

Der schnellste Weg wäre für mich zu lösen, um dynamisch eine temporäre Tabelle zu erstellen und dann jede Spalte aktualisiert über den Tisch zu bewegen. So dass Sie dynamische SQL erstellen, um eine temporäre Tabelle zu ändern, indem Sie für jeden N-Wert eine Spalte hinzufügen. – Avitus

+3

@ nbiswas_123: IHRE SHIFT KEY STICKS! OH NEIN, ES IST SPEEDING !!! 111eleveen! (Ehrlich gesagt, tu das nicht. Es sieht schrecklich.) – Tomalak

+0

Wow mit dieser Art von Haltung ... –

0
Select N1, N2, N3, N4 
from 
(select N_Column, N_Values from [your_table]) p 
PIVOT MIN(Tokens) 
FOR NameList IN ([N1],[N2],[N3],[N4]) 
) pvt 

rief ich die Spalten N_column und N_Values ​​von Ihrer ursprünglichen Tabelle [your_table] des tatsächlichen Namen nicht sicher.

Wenn Sie min, max verwenden, können Sie jeden Wert aggregieren, da es nur einen gibt.

+0

arbeitet nicht .. Übersetzungsfehler zu werfen. N! .. N4 sind Werte nicht Spaltennamen –

+0

Wie unterscheiden Sie die N # -Werte und die anderen Zahlen? Alle Ihre Spalten heißen name. Sie können die tatsächlichen Spaltennamen verwenden. – JeffO

+0

Mein Fehler. Sie haben zuerst das Ergebnis und dann die Tabellenstruktur eingegeben. – JeffO

0

Es ist nicht schön, aber ich habe eine Case-Anweisung dafür verwendet, aber die Überschriften müssen vorher festgelegt werden.

SELECT CASE heading 
WHEN 'N1' THEN value END AS 'N1' 
, CASE heading WHEN 'N2' THEN value END AS 'N2' 
, CASE heading WHEN 'N3' THEN value END AS 'N3' 
, CASE heading WHEN 'N4' THEN value END AS 'N4' 
+0

funktioniert nicht ... es schrieb vordefinierte Überschriften in gespeicherten proc. –

+0

Wenn Sie die erste Zeile müssen die Überschriften sein, fügen Sie „nur‚N1‘SELECT‚ N2‘,‚N3‘,‚N4‘UNION ... – atfergs

+0

Hallo, ich denke, dass einige Missverständnisse geschieht. N # alle sind Spalte [Namelist] Werte und nicht die Spaltennamen. So kann ich nicht schreiben „Wählen sie N1, N2, N3, N4“ –

0

Dies wird als EAV-Design bezeichnet. Wenn Sie große Datenmengen erwarten, ist Ihre Leistung sehr schlecht. Wenn das der Fall ist, möchten Sie möglicherweise zu einer Tabelle mit N1 N2 N3 N4 als Spalten wechseln und Ihr aktuelles Design aufgeben.

+0

ich bin nicht sicher, es EAV ist, aber es ist sicher verrückt! –

0

select 'N1', Name1 von your_able wo name1 <> 'N1' union

wählen Sie 'N2', Name2 von Ihrem_a ble wo name2 <>

'N2'

Vereinigung

select 'N3', Name3 von your_able wo name3 <>

'N3'

Vereinigung

wählen 'N4', Name4 von your_able wo name4 <> 'N4'

- die ta ble ist nicht normalisiert, daher wird diese Art von SQL verwendet.

+0

ich war von der gleichen Sache zu denken. doch , ändern Sie UNION in UNION ALL für eine bessere Leistung und genaue Ergebnisse. – beach

0

Das funktioniert aber nur wenn N1 ...N4 haben alle die gleiche Anzahl an Tokens.

SELECT 'N1' AS 'Name1', 'N2' AS 'Name2', 'N3' AS 'Name3', 'N4' AS 'Name4' 

UNION ALL 

SELECT 
     CAST(t1.Tokens AS varchar), 
     CAST(t2.Tokens AS varchar), 
     CAST(t3.Tokens AS varchar), 
     CAST(t4.Tokens AS varchar) 

    FROM (

     (SELECT Tokens, ROW_NUMBER() OVER(ORDER BY Tokens) AS rownum FROM so2 WHERE NameList = 'N1') t1 
     JOIN (SELECT Tokens, ROW_NUMBER() OVER(ORDER BY Tokens) AS rownum FROM so2 WHERE NameList = 'N2') t2 ON t1.rownum = t2.rownum 
     JOIN (SELECT Tokens, ROW_NUMBER() OVER(ORDER BY Tokens) AS rownum FROM so2 WHERE NameList = 'N3') t3 ON t1.rownum = t3.rownum 
     JOIN (SELECT Tokens, ROW_NUMBER() OVER(ORDER BY Tokens) AS rownum FROM so2 WHERE NameList = 'N4') t4 ON t1.rownum = t4.rownum 
    )