2009-12-11 5 views
0

J'ai une table avec la structure suivante:colonne SQL à la ligne de conversion

Col1 Col2 
--------------- 
1  2  
3  4 

Je dois requête dans la telle sorte que la sortie devrait être comme:

ColumnName | ColumnValue 
---------------------------- 
Col1   1 
Col2   2 
Col1   3 
Col2   4 

Toute aide à Ce sera grandement apprécié. Merci d'avance.

+2

Quelle base de données utilisez-vous? – Alex

+0

En ce qui concerne la commande, y a-t-il d'autres colonnes dans la table? Comme un «id»? –

Répondre

5

Il a été clarifié que la sortie doit être ordonnée de sorte qu'elle alterne entre col1 et col2. Col1 sera toujours affiché en premier, même si la valeur de col2 est inférieure. Ce:

Col1 | Col2 
------------ 
11 | 2 
30 | 42 

..should retour:

ColumnName | ColumnValue 
---------------------------- 
col1  | 11 
col2  | 2 
col1  | 30 
col2  | 42 

En effet, une liste alternative basée sur le classement.

La base de données utilisée par l'OP n'est pas claire. En supposant que MySQL, qui n'a pas de classement/fonctionnalité d'analyse, vous pouvez utiliser:

SELECT x.* 
    FROM (SELECT 'Col1' AS ColumnName, 
       a.col1 AS ColumnValue, 
       @rowcol1 := @rowcol1 + 1 AS rank 
      FROM TABLE a 
      JOIN (SELECT @rowcol1 := 0) r 
      UNION ALL 
      SELECT 'Col2', 
       b.col2, 
       @rownum := @rownum + 1 
      FROM TABLE b 
      JOIN (SELECT @rownum := 0) r) x 
ORDER BY x.rank, x.columnname 

SQL Server 2005+ et Oracle 9i + support des fonctions analytiques, de sorte que vous pouvez utiliser ROW_NUMBER ou RANK:

SELECT x.* 
    FROM (SELECT 'Col1' AS ColumnName, 
       a.col1 AS ColumnValue, 
       ROW_NUMBER() OVER(ORDER BY a.col1) AS rank 
      FROM TABLE a 
      UNION ALL 
      SELECT 'Col2', 
       b.col2, 
       ROW_NUMBER() OVER(ORDER BY b.col2) AS rank 
      FROM TABLE b) x 
ORDER BY x.rank, x.columnname 

Auparavant, sur la base sur les données d'exemple fourni:

SELECT 'Col1' AS ColumnName, 
     a.col1 AS ColumnValue 
    FROM TABLE a 
UNION ALL 
SELECT 'Col2', 
     b.col2 
    FROM TABLE b 
ORDER BY ColumnValue 

UNION ALL renvoie toutes les lignes, tandis que UNION supprimerait les doublons.

+0

Dammit, +1. Cela fonctionne = (j'étais trop lent – Alex

+0

Je ne peux pas d'accord avec votre mise en forme, mais vous avez 11k donc je suppose que vous faites quelque chose de bien.Bon travail –

+0

Désolé les gens..Cela ne fonctionne pas.Cette "ne fonctionne pas" la 'commande par' fetches en fonction de la valeur de la colonne. I besoin de la paire col1 et col2 valeurs l'une après l'autre. col1 col2 cette requête me récupère col2 2 col1 11 col1 30 col2 42 TOUTEFOIS, la sortie doit être col1 11 col2 2 col1 30 col2 42 –

1

Vous pouvez également essayer UNPIVOT

DECLARE @Table TABLE(
     Col1 INT, 
     Col2 INT 
) 

INSERT INTO @Table SELECT 1,2 
INSERT INTO @Table SELECT 3,4 

SELECT ColumnName, ColumnValue 
FROM (
      SELECT Col1, Col2 
      FROM @Table 
     ) p 
UNPIVOT 
    (
     ColumnValue FOR ColumnName IN (Col1, Col2) 
    ) upvt 
+0

Bienvenue sur 10k - qu'est-ce qui vous a pris si longtemps? :) –

+0

Thanx mec, te suivait, mais tu t'es enfui. Toi trop vite pour moi. Merci à tous les cas X-) –

+1

Je vous ai vu rattraper, donc je devais bouger :) –

0

Correction du problème de commande de la solution OMG:

SELECT 'Col1' AS ColumnName, 
     a.col1 AS ColumnValue 
    FROM TABLE a 
UNION ALL 
SELECT 'Col2', 
     b.col2 
    FROM TABLE b 
ORDER BY ColumnName, ColumnValue 
Questions connexes