Entrée:de colonne dans 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
Sortie:
Name1 Name2 Name3 Name4 ----------------------- N1 N2 N3 N4 1 2 4 7 3 1 8 7 4 8 5 7 7 5 3 8
Aide s'il vous plaît
Entrée:de colonne dans 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
Sortie:
Name1 Name2 Name3 Name4 ----------------------- N1 N2 N3 N4 1 2 4 7 3 1 8 7 4 8 5 7 7 5 3 8
Aide s'il vous plaît
Je ne pense pas que votre problème est bien défini, mais voici une solution:
--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
Ce qui donne des résultats:
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)
Vous ne pouvez pas le faire parce que selon les documents d'aide Microsoft:
: : = (aggregate_function (value_column) FOR pivot_column IN() )
Donc, sauf si vous faites une sorte de fonction d'agrégat, vous n'allez pas simplement obtenir un pivot de la colonne en utilisant la fonction de pivot. Toutefois, vous pouvez effectuer un pivotement des données ci-dessus avec une sélection normale et une instruction case.
Le moyen le plus rapide pour moi de résoudre serait de créer dynamiquement une table temporaire, puis de mettre à jour chaque colonne se déplaçant sur la table. de sorte que vous créez SQL dynamique pour modifier une table temporaire en ajoutant une colonne pour chaque valeur N que vous avez. – Avitus
@ nbiswas_123: VOS STICKS DE CLÉ DE MAJUSCULES! OH NO, C'EST SPEADING! (Honnêtement, ne faites pas cela.Il est horrible.) – Tomalak
Wow avec ce genre d'attitude ... –
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
J'ai appelé les colonnes N_column et N_Values de votre table d'origine [your_table] Je ne sais pas des noms réels.
Si vous utilisez min, max vous pouvez agréger n'importe quelle valeur puisqu'il n'y en a qu'une seule.
Ne fonctionne pas .. erreur de compilation de lancement. N! .. N4 sont des valeurs et non des noms de colonnes –
Comment différenciez-vous les valeurs N # et les autres nombres? Toutes vos colonnes sont appelées nom. Vous pouvez utiliser les noms de colonne réels. – JeffO
Mon erreur. Vous avez entré le résultat en premier, puis la structure de la table. – JeffO
Ce n'est pas joli, mais j'ai utilisé une déclaration de cas pour cela, mais les en-têtes devront être prédéterminés.
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'
ne fonctionne pas ... il a écrit des en-têtes prédéfinis dans proc stocké. –
Si vous avez besoin de la première rangée pour les en-têtes, ajoutez simplement "SELECT 'N1', 'N2', 'N3', 'N4' UNION ... – atfergs
Salut, je pense qu'il y a un malentendu. colonne [NameList] valeurs et non les noms de colonnes.Alors je ne peux pas écrire "Sélectionnez N1, N2, N3, N4" –
Ceci est appelé conception EAV. Si vous attendez de grandes quantités de données, vos performances seront très médiocres. Si c'est le cas, vous pouvez passer à une table avec N1 N2 N3 N4 en tant que colonnes, en abandonnant votre conception actuelle.
Je ne suis pas sûr que ce soit EAV, mais c'est vraiment loufoque! –
select 'N1', Name1 de your_able où nom1 <> union 'N1'
select 'N2', Nom2 de your_a ble où nom2 <> 'N2'
union
select 'N3', Nom3 de your_able où NAME3 <> 'N3'
union
select 'N4', Nom4 de your_able où nom4 <> 'N4'
- le ta ble n'est pas normalisé donc ce type de sql est utilisé.
Je pensais à la même chose. , changez UNION en UNION ALL pour de meilleures performances et des résultats précis. – beach
Cela fonctionne mais seulement si N1 ...N4 ont tous le même nombre de jetons.
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 a une attitude horrible, voir le commentaire ci-dessous. S'il vous plait fermer. –