Как развернуть несколько столбцов таблицы и получить результаты в нужном формате. - PullRequest
0 голосов
/ 24 октября 2018

Как повернуть таблицу ниже для достижения желаемого результата. Значения txtItem не являются фиксированными, может быть n значений txtItem.

txtItem  Rate  Revenue  Cost

   A      1200    45      30

   B      1300    55      40

   C      1400    60      30

   D      2100    55      35

Ожидаемый результат:

  ColumnName      A       B      C      D

  Rate          1200    1300   1400   2100

  Revenue        45      55     60     55

  Cost           30      40     30     35

Ответы [ 4 ]

0 голосов
/ 24 октября 2018

Предполагая, что ваши txtItems исправлены, вы можете ОТКЛЮЧИТЬ свой BelowTable и затем PIVOT результат:

SELECT ColumnName, A, B, C, D
FROM BelowTable
UNPIVOT (Amount FOR ColumnName IN (Rate, Revenue, Cost)) upvt
PIVOT (SUM(Amount) FOR txtItem IN (A, B, C, D)) pvt;
0 голосов
/ 24 октября 2018

с использованием unpivot и pivot

select name, [A], [B], [C],[D]
from
(
  select txtItem, name, value
  from yourtable
  unpivot
  (
    value for name in (Rate, Revenue, cost)
  ) unpiv
) src
pivot
(
  sum(value)
  for txtItem in ([A], [B], [C],[D])
) piv

name    A      B      C     D
cost    30    40      30    35
Rate    1200  1300    1400  2100
Revenue 45    55      60    55

Демонстрация в скрипке

0 голосов
/ 24 октября 2018

Чтобы иметь возможность транспонировать эту таблицу, выполните отклик, а затем отклик сводки

IF OBJECT_ID('tempDB..#TEMP', 'U') IS NOT NULL
DROP TABLE #TEMP
GO

CREATE TABLE #TEMP
(
    txtItem nvarchar(1),
    Rate int,
    Revenue int,
    Cost int
)

INSERT INTO #TEMP
VALUES
    ('A', 1200, 45, 30),
    ('B', 1300, 55, 40),
    ('C', 1400, 60, 30),
    ('D', 2100, 55, 35)



SELECT [ColumnName], [A],[B],[C],[D]
FROM
(
    SELECT *
    FROM #TEMP
    UNPIVOT
    (VALUE FOR ColumnName IN ([Rate],[Revenue],[Cost])
    ) UPV
) TAB
PIVOT
(
    SUM(VALUE)
    FOR txtItem IN ([A],[B],[C],[D])
) PIV
0 голосов
/ 24 октября 2018

Это unvpivot & pivot, поэтому вы можете сделать:

select colname, 
       max(case when txtItem = 'A' then val end) as A,
       max(case when txtItem = 'B' then val end) as B,
       max(case when txtItem = 'C' then val end) as C,
       max(case when txtItem = 'D' then val end) as D
from table t cross apply
     ( values (1, Rate, 'Rate'), (2, Revenue, 'Revenue'), (3, Cost, 'Cost') 
     ) tt(seq, val, colname)
group by seq, colname
order by seq;
...