Как получить процент от SQL-запроса с помощью GROUP BY

#sql #sql-server

Вопрос:

 SELECT hotel, SUM(stays_in_weekend_nights) AS 'total weekend night' 
FROM hotel_bookings
GROUP BY hotel;
 
Гостиница total_weekend_nights total_week_nights
Городской Отель 63082 173174
Курортный Отель 47664 125337

Я хочу показать результаты сверху в процентах, а не в цифрах, которые вы видите. Я пытался использовать:

 SELECT
    hotel, 
    stays_in_weekend_nights * 100/ SUM(stays_in_weekend_nights) OVER() 'Percentage'
 

Однако это дает мне только процент от каждого отдельного бронирования, а это не то, что я хочу. Есть какие-нибудь предложения?

Комментарии:

1. Непонятно, о чем вы спрашиваете. Вы спрашиваете, сколько ночей в выходные по сравнению с ночами в будние дни в отеле? Или % от общего числа ночей в выходные и будние дни по всем отелям? Можете ли вы показать желаемые результаты в табличном формате?

Ответ №1:

То, что вы написали, дает процент от указанного столбца.

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

 SELECT
  hotel,
  SUM(stays_in_weekend_nights) AS [total weekend night],
  SUM(stays_in_week_nights) AS [total week night],
  SUM(stays_in_weekend_nights) * 100.0 / SUM(stays_in_weekend_nights   stays_in_week_nights) AS [% weekend night],
  SUM(stays_in_week_nights) * 100.0 / SUM(stays_in_weekend_nights   stays_in_week_nights) AS [% week night]
FROM
  hotel_bookings
GROUP BY
  hotel;
 

Вы можете избежать некоторого повторения с подзапросами или общими табличными выражениями…

 WITH
  totals AS
(
  SELECT
    hotel,
    SUM(stays_in_weekend_nights) AS [total weekend night],
    SUM(stays_in_week_nights)    AS [total week night]
  FROM
    hotel_bookings
  GROUP BY
    hotel
)
SELECT
  *,
  [total weekend night] * 100.0 / ([total week night]   [total weekend night])   AS [% weekend night],
  [total week night]    * 100.0 / ([total week night]   [total weekend night])   AS [% week night]
FROM
  totals
 

Могут быть даже другие (лучшие) варианты, если вы покажете нам, как выглядят исходные данные.