Conversion de colonnes en lignes avec leurs données respectives dans le server sql

J'ai un scénario où j'ai besoin de convertir des colonnes de table en lignes par exemple – table – stocks:

ScripName ScripCode Price ----------------------------------------- 20 MICRONS 533022 39 

J'ai besoin de représenter la table dans le format suivant, mais j'ai juste besoin de ce type de représentation pour une seule ligne

 ColName ColValue ----------------------------- ScripName 20 MICRONS ScripCode 533022 Price 39 

de sorte que je peux directement lier datatables au contrôle datalist.

     declare @T table (ScripName varchar(50), ScripCode varchar(50), Price int) insert into @T values ('20 MICRONS', '533022', 39) select 'ScripName' as ColName, ScripName as ColValue from @T union all select 'ScripCode' as ColName, ScripCode as ColValue from @T union all select 'Price' as ColName, cast(Price as varchar(50)) as ColValue from @T 

    On dirait que vous voulez UNPIVOT

    Échantillon de livres en ligne:

     --Create the table and insert values as portrayed in the previous example. CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int, Emp3 int, Emp4 int, Emp5 int); GO INSERT INTO pvt VALUES (1,4,3,5,4,4); INSERT INTO pvt VALUES (2,4,1,5,5,5); INSERT INTO pvt VALUES (3,4,3,5,4,4); INSERT INTO pvt VALUES (4,4,2,5,5,4); INSERT INTO pvt VALUES (5,5,1,5,5,5); GO --Unpivot the table. SELECT VendorID, Employee, Orders FROM (SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5 FROM pvt) p UNPIVOT (Orders FOR Employee IN (Emp1, Emp2, Emp3, Emp4, Emp5) )AS unpvt; GO 

    Résultats:

     Commandes d'employé VendorID
     ---------- ---------- ------
     1 Emp1 4
     1 Emp2 3
     1 Emp3 5
     1 Emp4 4
     1 Emp5 4
     2 Emp1 4
     2 Emp2 1
     2 Emp3 5
     2 Emp4 5
     2 Emp5 5
    

    voir aussi: Unpivot SQL thingie et le tag unpivot

     select 'ScriptName', scriptName from table union all select 'ScriptCode', scriptCode from table union all select 'Price', price from table 
     DECLARE @TABLE TABLE (RowNo INT,ScripName VARCHAR(10),ScripCode VARCHAR(10) ,Price VARCHAR(10)) INSERT INTO @TABLE VALUES (1,'20 MICRONS ','533022','39') SELECT ColumnName,ColumnValue from @Table Unpivot(ColumnValue For ColumnName IN (ScripName,ScripCode,Price)) AS H 

    Comme alternative:

    L'utilisation de CROSS APPLY et VALUES effectue cette opération de manière simple et efficace avec un seul passage de la table (contrairement aux requêtes union qui effectuent un passage pour chaque colonne).

     SELECT ca.ColName, ca.ColValue FROM YOurTable CROSS APPLY ( Values ('ScripName' , ScripName), ('ScripCode' , ScripCode), ('Price' , cast(Price as varchar(50)) ) ) as CA (ColName, ColValue) 

    Personnellement, je trouve cette syntaxe plus facile que d'utiliser unpivot.

    NB: Vous devez veiller à ce que toutes les colonnes source soient converties en types compatibles pour la colonne à valeur unique

    J'ai résolu la requête de cette façon

     SELECT ca.ID, ca.[Name] FROM [Emp2] CROSS APPLY ( Values ('ID' , cast(ID as varchar)), ('[Name]' , Name) ) as CA (ID, Name) 

    la sortie ressemble à

      ID Name ------ -------------------------------------------------- ID 1 [Name] Joy ID 2 [Name] jean ID 4 [Name] paul