Как повернуть на два столбца в предопределенную таблицу? - PullRequest
0 голосов
/ 19 сентября 2018

Я видел этот вопрос , это и это , но это не то, что я хочу.

Пожалуйста, не надозакройте мой вопрос, так как он не повторяется.Это действительно важно для меня.

Мне удалось повернуть таблицу, но это нежелательный результат: enter image description here

Желаемый результатвыглядит следующим образом: enter image description here

Мой пример данных (это просто пример, когда OperatorX и OC столбцы должны быть 50 раз):

DECLARE @OperatorPrice TABLE (ID INT NOT NULL, OperatorId INT NULL, Price 
NUMERIC(18,3) NULL, FName VARCHAR(50) NULL)

INSERT INTO @OperatorPrice (
ID, OperatorId, Price, FName
)
VALUES
  (226, 996, 22954,'Operator1')
, (266, 1016, 79011.2,   'Operator3')
, (112, 1029, 14869,     'Operator4')
, (93,   1031, 10568.96, 'Operator5')


DECLARE @TR TABLE 
(
 ID INT NULL , 
    Operator1  DECIMAL(18,3) NULL, OC1  DECIMAL(18,3) NULL, Operator2  DECIMAL(18,3) NULL, 
    OC2  DECIMAL(18,3) NULL, Operator3  DECIMAL(18,3) NULL, OC3  DECIMAL(18,3) NULL, 
    Operator4  DECIMAL(18,3) NULL, OC4  DECIMAL(18,3) NULL, Operator5  DECIMAL(18,3) NULL, 
    OC5  DECIMAL(18,3) NULL
)

Пример кода:

INSERT @TR
(ID , 
Operator1, OC1, Operator2, OC2,  Operator3, OC3,  Operator4, OC4,  
Operator5, OC5)
SELECT ID , 
    Operator1, OC1, Operator2, OC2,  Operator3, OC3,  Operator4, OC4,  
Operator5, OC5
FROM 
(SELECT Price, id, FName 
FROM @OperatorPrice) AS SourceTable 
PIVOT 
( 
   sum(Price)
   FOR FName IN (Operator1, OC1, Operator2, OC2,  Operator3, OC3,  
   Operator4, OC4,  Operator5, OC5) 
) AS PivotTable

SELECT * FROM @TR

Как вставить данные в OC столбцы?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Возможно, что-то вроде этого.

В вашем псевдониме SOURCETABLE мы просто добавляем UNION ALL возможных комбинаций для идентификатора со значениями NULL.В этом случае MIN (ID) и значения 1 - 50

Просто убедитесь, что

1) Определите @TR со столбцами Operator1,OC1,..,Operator50,OC50 <<< </strong> OC# может быть INT

2) в FOR Item IN(Operator1,OC1,..,Operator50,OC50)

Пример - Редактировать Исправлено с учетом> 9 операторов

INSERT @TR
SELECT *
FROM  (
        Select A.ID
              ,B.*
         From  @OperatorPrice A
         Cross Apply ( values (FName,Price)
                             ,('OC'+replace(FName,'Operator',''),OperatorID)
                     ) B (Item,Value)
        Union All
        Select ID=(select min(ID) From @OperatorPrice)
              ,B.*
         From ( Select Top 50 N=Row_Number() Over (Order By (Select NULL)) From master..spt_values n1 ) A
         Cross Apply ( values (concat('Operator',N),NULL)
                             ,(concat('OC',N),NULL)
                     ) B (Item,Value)
       ) AS SourceTable 
PIVOT  ( sum(Value) FOR Item IN (Operator1, OC1, Operator2, OC2,  Operator3, OC3, Operator4, OC4,  Operator5, OC5) ) AS PivotTable

Select * from  @TR

Возврат - Уведомление Operator2

enter image description here

0 голосов
/ 19 сентября 2018

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

select op.ID
    , Operator1 = max(case when convert(int, replace(FName, 'Operator', '')) = 1 then Price end)
    , OC1 = max(case when convert(int, replace(FName, 'Operator', '')) = 1 then OperatorID end)
    , Operator2 = max(case when convert(int, replace(FName, 'Operator', '')) = 2 then Price end)
    , OC2 = max(case when convert(int, replace(FName, 'Operator', '')) = 2 then OperatorID end)
    , Operator3 = max(case when convert(int, replace(FName, 'Operator', '')) = 3 then Price end)
    , OC3 = max(case when convert(int, replace(FName, 'Operator', '')) = 3 then OperatorID end)
    , Operator4 = max(case when convert(int, replace(FName, 'Operator', '')) = 4 then Price end)
    , OC4 = max(case when convert(int, replace(FName, 'Operator', '')) = 4 then OperatorID end)
    , Operator5 = max(case when convert(int, replace(FName, 'Operator', '')) = 5 then Price end)
    , OC5 = max(case when convert(int, replace(FName, 'Operator', '')) = 5 then OperatorID end)
from @OperatorPrice op
cross apply
(
    values
    (1)
    ,(2)
    ,(3)
    ,(4)
)x(N)
group by op.ID
...