Преобразование одного столбца в заголовки столбцов - PullRequest
0 голосов
/ 09 мая 2018

Я все еще пытаюсь обернуть голову вокруг Pivot и Unpivot и тому подобного, но я никак не могу понять, как сделать что-то в T-SQL, что, я уверен, просто безумно просто. Поэтому я надеюсь, что некоторые из вас, гуру SSMS / T-SQL, могут помочь мне здесь.

Мне нужно повернуть что-то вроде этого:

Salesman    Number of Clients   # of Sales Last Year    # of Projected Sales
----------------------------------------------------------------------------
Rob              44                    200                    150
Bill             28                    120                    100           
Thomas           60                    300                    320

На что-то вроде этого:

                       Rob   Bill   Thomas
Number of Clients      44    28     60
# of Sales Last Year   200   120    300
# of Projected Sales   150   100    320

Кажется, что все приведенные мной примеры сводных и не сводных диаграмм работают, только если вы агрегируете значения с помощью SUM и т.п. Мне не нужно ничего агрегировать. Мне просто нужно перевести один из столбцов в заголовки столбцов, в основном.

Я видел несколько других примеров здесь. Но все они используют агрегацию или отдельные столбцы информации. Никто не делает то же самое, что я хочу сделать здесь. Мне просто нужен простой код, чтобы сделать то, что должно быть очень простой задачей. Если TSQL просто не может сделать это без какого-то сложного хитрого обходного пути, то будет работать и простой «TSQL не может этого сделать».

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Мне немного проще, если вы измените формат вашего набора данных.

declare @example table (
    ExampleID       int identity(1,1) not null primary key clustered
,   SalesPerson     nvarchar(255) not null
,   AmountOfClient  int not null
,   SalesLastYear   int not null
,   ProjectedSales  int not null
);

insert into @example (SalesPerson, AmountOfClient, SalesLastYear, ProjectedSales)
select 'Rob', 44, 200, 150 union all
select 'Bill', 28, 120, 100 union all  
select 'Thomas', 60, 300, 320;

;with cte as (
select SalesPerson
     , AmountOfClient as Metric
     , 'Clients' as [Type]
  from @example

union all

select SalesPerson
     , SalesLastYear
     , 'LastYear' as [Type]
  from @example

union all

select SalesPerson
     , ProjectedSales
     , 'Projected' as [Type]
  from @example
    )

 --select * from cte
select [Type]
     , [Rob]
     , [Bill]
     , [Thomas]
      from
        (
         select SalesPerson
              , metric
              , [type]
           from cte
           ) source
  pivot
        (
            max(Metric) 
                for SalesPerson in ([Rob], [Bill], [Thomas])
        ) as pvt;

Результирующий набор

Type        Rob   Bill  Thomas
Clients     44    28    60
LastYear    200   120   300
Projected   150   100   320
0 голосов
/ 09 мая 2018

Чтобы получить нужный вам вывод, вы можете использовать предложения PIVOT и UNPIVOT ...

SELECT * 
FROM   (SELECT * 
        FROM   tablename 
               UNPIVOT(vls 
                      FOR vlsnames IN ([NumberofClients], 
                                       [ofSalesLastYear], 
                                       [ofProjectedSales] )) AS unpvt) tmp 
       PIVOT( Max(vls) 
            FOR salesman IN ([Rob], [Bill], [Thomas]) ) AS pvt; 

Вывод (шаг за шагом)

+----------+-----------------+-----------------+------------------+
| Salesman | NumberofClients | ofSalesLastYear | ofProjectedSales |
+----------+-----------------+-----------------+------------------+
| Rob      |              44 |             200 |              150 |
| Bill     |              28 |             120 |              100 |
| Thomas   |              60 |             300 |              320 |
+----------+-----------------+-----------------+------------------+

UNPIVOT clause 
+----------+-----+------------------+   
| Salesman | vls |     vlsnames     |      ;;;;;
+----------+-----+------------------+      ;;;;;
| Rob      |  44 | NumberofClients  |      ;;;;;
| Rob      | 200 | ofSalesLastYear  |    ..;;;;;..
| Rob      | 150 | ofProjectedSales |     ':::::'
| Bill     |  28 | NumberofClients  |       ':`
| Bill     | 120 | ofSalesLastYear  |
| Bill     | 100 | ofProjectedSales |
| Thomas   |  60 | NumberofClients  |
| Thomas   | 300 | ofSalesLastYear  |
| Thomas   | 320 | ofProjectedSales |
+----------+-----+------------------+

PIVOT clause - PIVOT(UNPIVOT)  
+------------------+-----+------+--------+
|     vlsNames     | Rob | Bill | Thomas |
+------------------+-----+------+--------+
| NumberofClients  |  44 |   28 |     60 |
| ofProjectedSales | 150 |  100 |    320 |
| ofSalesLastYear  | 200 |  120 |    300 |
+------------------+-----+------+--------+

Онлайн-демонстрация: http://www.sqlfiddle.com/#!18/0df49/9/2

Ссылка:
https://www.techonthenet.com/sql_server/pivot.php
https://docs.microsoft.com/en-us/sql/t-sql/queries/from-using-pivot-and-unpivot?view=sql-server-2017

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