2009-06-17 7 views
-2

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

+0

OP a une attitude horrible, voir le commentaire ci-dessous. S'il vous plait fermer. –

Répondre

2

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

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.

+0

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

+3

@ nbiswas_123: VOS STICKS DE CLÉ DE MAJUSCULES! OH NO, C'EST SPEADING! (Honnêtement, ne faites pas cela.Il est horrible.) – Tomalak

+0

Wow avec ce genre d'attitude ... –

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 

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.

+0

Ne fonctionne pas .. erreur de compilation de lancement. N! .. N4 sont des valeurs et non des noms de colonnes –

+0

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

+0

Mon erreur. Vous avez entré le résultat en premier, puis la structure de la table. – JeffO

0

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' 
+0

ne fonctionne pas ... il a écrit des en-têtes prédéfinis dans proc stocké. –

+0

Si vous avez besoin de la première rangée pour les en-têtes, ajoutez simplement "SELECT 'N1', 'N2', 'N3', 'N4' UNION ... – atfergs

+0

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" –

0

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.

+0

Je ne suis pas sûr que ce soit EAV, mais c'est vraiment loufoque! –

0

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é.

+0

Je pensais à la même chose. , changez UNION en UNION ALL pour de meilleures performances et des résultats précis. – beach

0

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 
    ) 
Questions connexes