Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Торможу с With. Прошу помощи  [new]
smallserg
Member

Откуда:
Сообщений: 82
declare @s varchar(1000)
declare @s2 varchar(8000)
set @s='[URKA],[TWTR US],[T US],[SNE US],[SBER],[LPL US],[KORS US],[HII US],[GOOGL US],[EVRAZ6],[elgz],[DAL US],[CTL US],[CRBKMO 8.7 11/13/18],[BA/ LN],[AZN US],[AKBTY US],[AAPL US],[A1AUL9]'

set @s2='Select left(' +  left(@s,charindex(',',@s,1)-1)+',charindex(''|'','+left(@s,charindex(',',@s,1)-1)+')-1),
right('+ +  left(@s,charindex(',',@s,1)-1)+',charindex('','',@s,1)-charindex(''|'','+left(@s,charindex(',',@s,1)-1)+')-1)
 '

Поля содержат данные вида

[URKA] [TWTR US]
45665|6555 241|66321


Нужно получить следующий результат:

Имена полей
[URKA1] [URKA2] [TWTR US1] [TWTR US2] [T US1] [T US2] [SNE US1] [SNE US2] [SBER1] [SBER2]

45665 6555 241 66321 и т.д.

Количество полей и их названия приходят в строке @s.

Что-то торможу как это сделать через With.( для всех полей и данных)
31 авг 15, 18:11    [18092554]     Ответить | Цитировать Сообщить модератору
 Re: Торможу с With. Прошу помощи  [new]
Glory
Member

Откуда:
Сообщений: 104751
smallserg
Поля содержат данные вида

А где в вашем поимере эти самые "поля" ?

smallserg
Нужно получить следующий результат:

Алгоритм самим можно придумать ?
31 авг 15, 18:14    [18092568]     Ответить | Цитировать Сообщить модератору
 Re: Торможу с With. Прошу помощи  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8813
smallserg, какой-то кусок задачи, вырванный из куска задачи...

Называется определить настроение водителя по фотографии номера автомобиля.
31 авг 15, 18:31    [18092619]     Ответить | Цитировать Сообщить модератору
 Re: Торможу с With. Прошу помощи  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Glory
в вашем поимере


абсолютно правильное термин для вышеприведенного куска кода.
31 авг 15, 18:48    [18092688]     Ответить | Цитировать Сообщить модератору
 Re: Торможу с With. Прошу помощи  [new]
smallserg
Member

Откуда:
Сообщений: 82
Glory,
Дано:

Client   Quantity     Cost             Name

PCA-029	738	        8.287	        BA/ LN
PCA-035	8	     683.023  	GOOGL US
PCA-035	150	       47.271	KORS US
PCA-035	310	      123.977	AAPL US
PCA-027	356	       46.570	DAL US
PCA-027	863	       12.699	LPL US
PCA-035	45	     683.023	     GOOGL US
PCA-038	5018	       39.631	AZN USv

Нужно получить :
                 BA/ LN     COST    GOOGL US     COST   kORS US    COST   AAPL US    COST     DAL US   COST    LPL US   COST   AZN  US    COST          
PCA-029         738        8.287
PCA-035                               8       683.023    150     47.271     310     123.977        
PCA-027                                                                                        356     46.570    863   12.699
PCA-038                                                                                                                            5018   39.631
......

и так далее
Поле Client может возвращать что угодно, приходит в ХП как строка с перечислением через запятую, содержимое поля Name в зависимости от даты переменно,
поэтому буду переделывать в динамический запрос. Пока в Pivot забит список.
Делаю так :
declare @Date smalldatetime
select @Date='20150828'
declare  @sovl_roi_op Table (Client varchar(100),Quantity int,Cost numeric(20,6),
SecurityBrief varchar(20),date datetime,SecurityID int)
insert into @sovl_roi_op (Client ,Quantity ,Cost ,SecurityBrief,date, SecurityID)

select 'PCA-029',	738,	8.287,	'BA/ LN', '20150828',1
union
select 'PCA-035',	8,	683.023,	'GOOGL US', '20150828',2
union
select  'PCA-035',	150,	47.271,	 'KORS US', '20150828',3
union
select  'PCA-035',	310,	123.977,  'AAPL US', '20150828',4
union
select  'PCA-027',	356,	46.570,	   'DAL US', '20150828',5
union
select  'PCA-027',	863,	12.699,	   'LPL US', '20150828',6
union
select   'PCA-038', 5018,    39.631,   'AZN US','20150828',7


DECLARE @T TABLE(ID INT,S VARCHAR(1000));
DECLARE @T2 TABLE(S VARCHAR(100));  --  для  разбора  параметра  @s  в  строки
declare @s varchar(1000)
set @s=replace('''PCA-001'''+','+'''PCA-027'''+','+'''PCA-029'''+','+'''PCA-035'''+','+'''PCA-038'''+','+'''PCA-048'''+','+'''PCA-049'''
+','+'''PCA-050'''+','+'''PCA-051'''+','+'''PCA-056'''+','+'''PCA-067'''+','+'''PCA-072'''+','+'''PCA-074''','''','')
--  разбор  параметра  @s  в  строки  таблицы  @t2
INSERT @T(ID,S) SELECT 1,@s;

DECLARE @Delimiters VARCHAR(100);
SET @Delimiters=','+CHAR(9)+CHAR(10)+CHAR(13);
insert @t2
SELECT S
FROM
(
 SELECT T.ID,SUBSTRING(T.S COLLATE Cyrillic_General_CI_AI,V.number,
  (
   SELECT MIN(VV.number)
   FROM master.dbo.spt_values VV JOIN @T TT
   ON TT.ID=T.ID AND VV.type='P' AND VV.number BETWEEN V.number AND LEN(TT.S)+1
   AND CHARINDEX(SUBSTRING(TT.S+LEFT(@Delimiters,1),VV.number,1),@Delimiters)>0
  )-V.number
 )
 FROM @T T CROSS JOIN master.dbo.spt_values V
 WHERE V.type='P' AND V.number BETWEEN 1 AND LEN(T.S)+1
 AND CHARINDEX(SUBSTRING(LEFT(@Delimiters,1)+T.S,V.number,1),@Delimiters)>0
)T(ID,S)
WHERE S>''
ORDER BY ID,S;

select * 
from 
(select Client,
Qq+'|'+
cc as Quantity,SecurityBrief
  from
 (select Client,
        Quantity,cost,
        convert(varChar(20),convert(int,Quantity)) qq, 
        convert(varchar(15),convert(numeric(18,3),cost)) cc,SecurityBrief
     from
     (select op.Client as Client
             ,sum(op.Quantity) as Quantity
             ,sum(op.cost) cost
             ,max(SecurityBrief) SecurityBrief
        from @sovl_roi_op op
             inner join @t2 tt on op.client=tt.s
             where op.date=@Date
             group by op.SecurityID, op.Client
      ) q 
  )z
) srce 
PIVOT 
 (max(Quantity)
  for SecurityBrief 
   IN ([URKA],[TWTR US],[T US],[SNE US],[SBER],[LPL US],[KORS US],[HII US],[GOOGL US],[EVRAZ6],[elgz],[DAL US],[CTL US],[CRBKMO 8.7 11/13/18],[BA/ LN],[AZN US],[AKBTY US],[AAPL US],[A1AUL9])
 ) pvt        
order by client


После чего значение каждого поля нужно разбить на 2 столбца (по разделителю "|")
1 сен 15, 11:02    [18094232]     Ответить | Цитировать Сообщить модератору
 Re: Торможу с With. Прошу помощи  [new]
Glory
Member

Откуда:
Сообщений: 104751
smallserg
Нужно получить :
                 BA/ LN     COST    GOOGL US     COST   kORS US    COST   AAPL US    COST     DAL US   COST    LPL US   COST   AZN  US    COST          
PCA-029         738        8.287
PCA-035                               8       683.023    150     47.271     310     123.977        
PCA-027                                                                                        356     46.570    863   12.699
PCA-038                                                                                                                            5018   39.631
......

Это называется cross-tab или перекрестный запрос или "шахматка"
Вопрос про это задают по несколько раз в неделю
1 сен 15, 11:22    [18094309]     Ответить | Цитировать Сообщить модератору
 Re: Торможу с With. Прошу помощи  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4893
Забубенить кросстаб можно в SSRS, Excel (Pivot table), OLAP-кубе (MDX) и прочих инструментах.
1 сен 15, 11:25    [18094321]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить