Преобразование столбцов в строки с соответствующими данными на сервере SQL - PullRequest
10 голосов
/ 17 марта 2011

У меня есть сценарий, в котором мне нужно преобразовать столбцы таблицы в строки, например - таблица - акции:

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

Мне нужно представить таблицу в следующем формате, но мне просто нужен такой видпредставление для одной строки

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

, чтобы я мог напрямую связать данные с элементом управления списком данных.

Ответы [ 6 ]

11 голосов
/ 17 марта 2011

Звучит так, как вы хотите UNPIVOT

Пример из книг онлайн:

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

Возвращает:

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

см. Также: Unpivot SQL thingie и unpivot tag

7 голосов
/ 17 марта 2011
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
1 голос
/ 14 декабря 2016
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 голос
/ 17 марта 2011
select 'ScriptName', scriptName from table
union all
select 'ScriptCode', scriptCode from table
union all
select 'Price', price from table
0 голосов
/ 11 октября 2017

я решил запрос таким образом

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

  ) as CA (ID, Name)

вывод выглядит как

  ID     Name
------ --------------------------------------------------
ID     1
[Name] Joy
ID     2
[Name] jean
ID     4
[Name] paul
0 голосов
/ 11 июня 2016

В качестве альтернативы:

Использование CROSS APPLY и VALUES выполняет эту операцию достаточно просто и эффективно всего за один проход таблицы (в отличие от запросов на объединение, которые выполняют один проход для каждого столбца)

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

Лично я нахожу этот синтаксис проще, чем использование unpivot.

Примечание: вы должны позаботиться о том, чтобы все исходные столбцы были преобразованы в совместимые типы для столбца с одним значением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...