2016-08-21 5 views
1

У меня есть запрос, как этотКак UNPIVOT столбец с различным типом данных SQL Server

SELECT 
    totalvolume = SUM(volume), 
    totalusage = SUM(usage), 
    percentage = CAST(SUM(usage) * 100/SUM(volume) as decimal (10,2)), 
    YEAR 
FROM 
    table1 

и я получаю таблицу, как показано ниже

|totalvolume|totalusage|percentage|Year 
|-------------------------------------- 
| 100  | 50  | 50.00 |2016 
| 200  | 50  | 25.00 |2015 

Моя цель состоит в том, чтобы таблица список выглядит это с помощью PIVOT:

|Type  |2015 |2016 | 
|------------------------ | 
| totalvolume| 200 | 100 | 
| totalusage | 50 | 50 | 
| percentage |25.00|50.00 | 

Поэтому я решил создать эту таблицу первой помощи) UNPIVOT :

Type  | Value | year 
------------------- 
totalvolume |100 |2016 
totalusage |50  |2016 
percentage |50.00 |2016 
totalvolume |200 |2015 
totalusage |50  |2015 
percentage |25.00 |2015 

но в моем UNPIVOT запросе

SELECT 
    Type, Value, Year 
FROM 
    <my table query> 
UNPIVOT 
    (value FOR Type IN (totalvolume, totalusage, percentage)) 

Там есть ошибка в моей SQL:

Тип столбца «Процент» конфликтов с типом других столбцов, указанных в UNPIVOT

Так же есть решение для золя это проблема без изменения типа данных?

Если исключить процент колонки я мог бы получить вид я хочу с помощью шарнира, так что будет как этот

|Type  |2015 |2016 | 
|------------------------ | 
| totalvolume| 200 | 100 | 
| totalusage | 50 | 50 | 

Но мне нужно процент строк, тоже.

Заранее спасибо

+0

Как поворот, так и форматирование (например, «проценты») действительно представляют функции инструментальных средств, а не функции базы данных. Что вы делаете с этими данными? Отправка его в виде отчета? Используйте инструмент отчетности. –

ответ

0

Там нет никакого способа, чтобы иметь различные типы данных в пределах одного столбца. Но вы можете моделировать его путем преобразования всех значений VARCHAR, как показано ниже

SELECT 
    Type, Value, Year 
FROM 
    (select 
     convert(varchar(100), totalvolume) as totalvolume, 
     convert(varchar(100), totalusage) as totalusage, 
     convert(varchar(100), percentage) as totalusage 
     from <my table query>) pv 
UNPIVOT 
    (value FOR Type IN (totalvolume, totalusage, percentage)) unp 

Затем, если вам нужно сделать некоторые расчеты, вам придется делать преобразование разворота.

+0

Итак, в основном мне нужно преобразовать в varchar, чтобы получить таблицу «нетвор», а затем преобразовать ее снова для окончательной сводной таблицы? –

+0

Вам нужно его снова преобразовать только тогда, когда вы планируете выполнять некоторые вычисления, такие как MAX, MIN, AVG, SUM и т. Д. Если вам просто нужно отобразить выходные данные, вам не нужно преобразовывать их обратно в исходный тип данных , – Anton

+0

Например, если вам нужно найти общий объем, вы должны сделать что-то вроде SELECT SUM (CONVERT (int, Value)) FROM unpivot_table WHERE Тип = 'totalvolume' – Anton

0

В этом случае вы можете преобразовать в общий цифровой формат для операции поворота, а затем отформатировать параметры для окончательного вывода.

with data(totalvolume, totalusage, percentage, Year) as (
    select 100, 50, 50.00, 2016 union all 
    select 200, 50, 25.00, 2015 
), converted(totalvolume, totalusage, percentage, Year) as (
    select 
     cast(totalvolume as decimal(8, 2)), 
     cast(totalusage as decimal(8, 2)), 
     cast(percentage as decimal(8, 2)), 
     cast(Year as decimal(8, 2)) 
    from data 
) 
select 
    Type, 
    case 
     when Type in ('totalvolume', 'totalusage') then format(Value, '0') 
     when Type = 'percentage' then format(Value, '0.00\%') 
    end as Value, 
    format(Year, '0') as Year 
from converted unpivot 
    (value for Type int (totalvolume, totalusage, percentage)) as unpvt 
order by 
    Year, Type desc; 
Смежные вопросы