SQL - преобразование значений столбцов символов в столбцы с символами в качестве имен и типов логических значений - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть эта таблица со столбцом символа:

enter image description here

Я хочу преобразовать ее в таблицу, в которой есть значения столбца символа (разные)как новое имя столбца.Эти столбцы должны иметь тип bool или INT (0/1).Результирующая таблица должна выглядеть следующим образом:

enter image description here

PS Что если набор столбцов был динамически сгенерирован другим запросом?

Ответы [ 4 ]

0 голосов
/ 25 декабря 2018

Вы также можете применить оператор pivot к динамическому SQL.

Например:

create table test03
(
Symbol varchar(30),
PartOfDay int,
isProfitable int
)

insert into test03 values
('ACRX',3,0),
('ACRX',3,0),
('ANF',2,1),
('ANF',2,1),
('ANF',2,1),
('NVDA',3,1),
('RSX',3,0),
('RSX',3,0)

--Query

DECLARE @V_COLUMNS VARCHAR(MAX)
DECLARE @V_SQL VARCHAR(MAX)
SET @V_COLUMNS=STUFF((SELECT DISTINCT ','+QUOTENAME(Symbol) FROM test03 FOR XML PATH('')),1,1,'')
--print @V_COLUMNS

SET @V_SQL='
;WITH CTE AS
(
select 
ROW_NUMBER() over (order by Symbol) as RN,
Symbol,
1 AS V_VALUE,
PartOfDay,
isProfitable
from test03
)
SELECT '+@V_COLUMNS+',PartOfDay,isProfitable
FROM CTE 
PIVOT 
(
COUNT(V_VALUE) FOR Symbol IN ('+@V_COLUMNS+')
) PVT'

--PRINT @V_SQL
EXEC(@V_SQL)

--Output
/*
ACRX        ANF         NVDA        RSX         PartOfDay   isProfitable
----------- ----------- ----------- ----------- ----------- ------------
1           0           0           0           3           0
1           0           0           0           3           0
0           1           0           0           2           1
0           1           0           0           2           1
0           1           0           0           2           1
0           0           1           0           3           1
0           0           0           1           3           0
0           0           0           1           3           0
*/
0 голосов
/ 24 декабря 2018

вы можете сделать

select 
  IIF('ACRX', 1, 0) as acrx,
  IIF('ANF', 1, 0) as anf,
  IIF('NVDA', 1, 0) as nvda,
  IIF('RXS', 1, 0) as rsx,
  partofday, 
  isprofitable
from t;
0 голосов
/ 24 декабря 2018

Если вам нужны динамические столбцы, вам потребуется динамический SQL

Пример

Declare @SQL varchar(max) = Stuff((Select Distinct ',' + QuoteName(Symbol)+'=case when symbol='''+Symbol+''' then 1 else 0 end ' From Yourtable  Order by 1 For XML Path('')),1,1,'') 

Select @SQL = '
Select '+@SQL+'
      ,PartOfDay
      ,isProfitable
 From  YourTable
'
Exec(@SQL)

Возвращает

enter image description here

0 голосов
/ 24 декабря 2018

Просто используйте case:

select (case when symbol = 'ACRX' then 1 else 0 end) as acrx,
       (case when symbol = 'ANF' then 1 else 0 end) as anf,
       (case when symbol = 'NVDA' then 1 else 0 end) as nvda,
       (case when symbol = 'rsx' then 1 else 0 end) as rsx,
       partofday, isprofitable
from t;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...