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
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
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)
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.
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
@ nbiswas_123: IHRE SHIFT KEY STICKS! OH NEIN, ES IST SPEEDING !!! 111eleveen! (Ehrlich gesagt, tu das nicht. Es sieht schrecklich.) – Tomalak
Wow mit dieser Art von Haltung ... –
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.
arbeitet nicht .. Übersetzungsfehler zu werfen. N! .. N4 sind Werte nicht Spaltennamen –
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
Mein Fehler. Sie haben zuerst das Ergebnis und dann die Tabellenstruktur eingegeben. – JeffO
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'
funktioniert nicht ... es schrieb vordefinierte Überschriften in gespeicherten proc. –
Wenn Sie die erste Zeile müssen die Überschriften sein, fügen Sie „nur‚N1‘SELECT‚ N2‘,‚N3‘,‚N4‘UNION ... – atfergs
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“ –
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.
ich bin nicht sicher, es EAV ist, aber es ist sicher verrückt! –
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.
ich war von der gleichen Sache zu denken. doch , ändern Sie UNION in UNION ALL für eine bessere Leistung und genaue Ergebnisse. – beach
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
)
OP hat eine schreckliche Haltung, siehe Kommentar unten. Bitte schließe. –