2014-12-24 6 views
1

У меня есть следующий SQL-запрос, запущенный в SQL Server 2014, и он отлично работает. Теперь мне нужно изменить запрос так, чтобы результат был выражен в процентах (подробнее об этом ниже).SQL Query для выражения вывода из Pivot Query в процентах

SELECT * 
FROM (SELECT [PropertyCode], 
      [MTH], 
      [ROOM NIGHTS] 
    FROM HOLDINGS) a 
    PIVOT (Sum([ROOM NIGHTS]) 
     FOR [MTH] IN ([NOVEMBER 2014], 
         [DECEMBER 2014], 
         [JANUARY 2015])) AS PVTTABLE 

ХОЛДИНГ в запросе, приведенном выше, является таблицей представлений.

Выход из приведенного выше запроса выглядит следующим образом:

PropertyCode NOVEMBER 2014 DECEMBER 2014 JANUARY 2015 
HOTEL A   1,200    560   700 
HOTEL B   900    430   500 
HOTEL C   800    650   200 

HOTEL А имеет 65 номеров, отель B 120 номеров и отель C 50 номеров и эти данные находятся в таблице под названием МОЩНОСТИ с колоннами " PropertyCode "и" Rooms "(перечисление количества комнат, как указано выше).

мне нужно изменить мой сводной запрос таким образом, что результат выглядит следующим образом:

PropertyCode NOVEMBER 2014 DECEMBER 2014 JANUARY 2015 
HOTEL A   61%    28%    35% 
HOTEL B   25%    11%    13% 
HOTEL C   53%    42%    13% 

Проценты рассчитываются следующим образом: ночёвок/(Нет номера конкретных отеля * дней в месяце) * 100

Мне кажется, мне нужен LEFT JOIN, чтобы соответствовать PropertyCode из таблицы представлений HOLDINGS и таблицы CAPACITY, и мне также потребуется изменить часть PIVOT (Sum ([ROOM NIGHTS]) в моем первоначальном запросе, так что что он вычисляет результат как%, но я зациклился на том, как писать синтаксис.

ответ

1

что-то на этих линиях должны работать:

SELECT [PropertyCode],[MTH], 
[NOVEMBER 2014]/(SELECT rooms FROM capacity c WHERE c.propertycode=pvttable.propertycode)*30*100. as nov2014, 
[DECEMBER 2014]/(SELECT rooms FROM capacity c WHERE c.propertycode=pvttable.propertycode)*31*100. as dec2014, 
[JANUARY 2015]/(SELECT rooms FROM capacity c WHERE c.propertycode=pvttable.propertycode)*31*100. as jan2015 
FROM (SELECT [PropertyCode], 
      [MTH], 
      [ROOM NIGHTS] 
    FROM HOLDINGS) a 
    PIVOT (Sum([ROOM NIGHTS]) 
     FOR [MTH] IN ([NOVEMBER 2014], 
         [DECEMBER 2014], 
         [JANUARY 2015])) AS PVTTABLE 

Или с помощью JOIN вместо коррелированных запросов:

SELECT [PropertyCode],[MTH], 
[NOVEMBER 2014]/rooms * 30 * 100. AS Nov2014, 
[DECEMBER 2014]/rooms * 31 * 100. AS Dec2014, 
[JANUARY 2015]/rooms * 31 * 100. AS Jan2015 
FROM (SELECT [PropertyCode], 
      [MTH], 
      [ROOM NIGHTS] 
    FROM HOLDINGS) a 
    PIVOT (Sum([ROOM NIGHTS]) 
     FOR [MTH] IN ([NOVEMBER 2014], 
         [DECEMBER 2014], 
         [JANUARY 2015])) AS PVTTABLE 
JOIN capacity c ON c.propertycode=pvttable.propertycode 
+0

Спасибо. Я вставил пару кронштейнов вдоль предлагаемого решения, и он блестяще работал: [ДЕКАБРЬ 2014]/(((SELECT номера FROM HotelInventory c WHERE c.propertycode = pvttable.propertycode) * 31)/100) как Dec2014 Теперь я просто нужно, чтобы результат был одним десятичным знаком или выглядел как «89%» с добавленным знаком%. – user3115933

+0

Я пробовал следующее относительно добавления знака%: [ДЕКАБРЬ 2014]/(((SELECT номера FROM HotelInventory c WHERE c.propertycode = pvttable.propertycode) * 31)/100) + '%' как Dec2014 , но это дает мне ошибку msg «Ошибка преобразования типа данных varchar в float». Я был бы рад, если бы вы могли помочь здесь в отношении одного десятичного знака и знака%. – user3115933

+0

Есть несколько шагов, которые вам могут потребоваться; SQL-сервер не очень хорош в форматировании. – Jayvee