web-dev-qa-db-fra.com

Conversion de colonnes en lignes avec leurs données respectives dans le serveur SQL

J'ai un scénario dans lequel je dois convertir des colonnes de table en lignes Par exemple, - Table - stocks:

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

Je dois représenter la table dans le format suivant, mais j'ai simplement besoin de ce type de représentation pour une seule ligne. 

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

afin que je puisse lier directement les données au contrôle datalist.

10
Ish Tech
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
7
Mikael Eriksson

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: 

 VendorID Employee Orders 
---------- ---------- ------
 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 la balise unpivot

11
Sam Saffron
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
1
Chalavadi Kishore
select 'ScriptName', scriptName from table
union all
select 'ScriptCode', scriptCode from table
union all
select 'Price', price from table
1
Sachin Shanbhag

Comme alternative: 

L'utilisation de CROSS APPLY et de VALUES permet d'effectuer cette opération très simplement et efficacement avec un seul passage de la table (contrairement aux requêtes d'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. 

0
Used_By_Already

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