sql - использование агрегатных функций (мин / макс) как части оператора выбора - PullRequest
1 голос
/ 26 ноября 2008

Я пытаюсь вернуть минимальные и максимальные цены для системы бронирования вилл. У меня есть справочная таблица, в которой хранится цена каждой недели для каждой виллы.

Я использую функции min и max для этого в select, но у меня много проблем. Может кто-нибудь объяснить, где я иду не так? Вот сп

ALTER PROCEDURE spVillaGet 
-- Add the parameters for the stored procedure here
@accomodationTypeFK int = null,
@regionFK int = null,
@arrivalDate datetime = null,
@numberOfNights int = null,
@sleeps int = null,
@priceFloor money = null,
@priceCeil money = null

AS НАЧАТЬ - SET NOCOUNT ON добавлен для предотвращения дополнительных наборов результатов - вмешательство в операторы SELECT. SET NOCOUNT ON;

-- Insert statements for procedure here
SELECT tblVillas.name, 
       tblVillas.introduction,
       tblVillas.italian_introduction,
       tblVillas.uk_content,
       tblVillas.italian_content,
       tblVillas.sleeps,
       tblVillas.postcode,
       tblLkUpRegions.regionName,
       tblLkUpAccomodationTypes.accomodationType,
       MIN(price) As MinPrice,
       MAX(price) As MaxPrice

FROM tblVillas

LEFT JOIN tblLkUpRegions on tblVillas.regionFK = tblLkUpRegions.regionID
LEFT JOIN tblLkUpAccomodationTypes on tblVillas.accomodationTypeFK = tblLkUpAccomodationTypes.accomodationId    
LEFT JOIN tblWeeklyPrices on tblWeeklyPrices.villaFK = tblVillas.villaId

WHERE

    ((@accomodationTypeFK is null OR accomodationTypeFK = @accomodationTypeFK)
     AND (@regionFK is null OR regionFK = @regionFK)
     AND (@sleeps is null OR sleeps = @sleeps) 
     AND tblVillas.deleted = 0)

GROUP BY tblVillas.name

Ответы [ 2 ]

3 голосов
/ 26 ноября 2008

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

GROUP BY tblVillas.name, 
       tblVillas.introduction,
       tblVillas.italian_introduction,
       tblVillas.uk_content,
       tblVillas.italian_content,
       tblVillas.sleeps,
       tblVillas.postcode,
       tblLkUpRegions.regionName,
       tblLkUpAccomodationTypes.accomodationType

Из вашего последующего комментария видно, что некоторые из ваших столбцов относятся к типу данных, который нельзя использовать в предложении GROUP BY. Попробуйте вместо этого:

SELECT tblVillas.name, 
           tblVillas.introduction,
           tblVillas.italian_introduction,
           tblVillas.uk_content,
           tblVillas.italian_content,
           tblVillas.sleeps,
           tblVillas.postcode,
           tblLkUpRegions.regionName,
           tblLkUpAccomodationTypes.accomodationType,
           (SELECT MIN(price) FROM tblWeeklyPrices where tblWeeklyPrices.villaFK = tblVillas.villaId) As MinPrice,
           (SELECT MAX(price) FROM tblWeeklyPrices where tblWeeklyPrices.villaFK = tblVillas.villaId) As MaxPrice
FROM tblVillas
LEFT JOIN tblLkUpRegions on tblVillas.regionFK = tblLkUpRegions.regionID
LEFT JOIN tblLkUpAccomodationTypes on tblVillas.accomodationTypeFK = tblLkUpAccomodationTypes.accomodationId    
WHERE
        ((@accomodationTypeFK is null OR accomodationTypeFK = @accomodationTypeFK)
         AND (@regionFK is null OR regionFK = @regionFK)
         AND (@sleeps is null OR sleeps = @sleeps) 
         AND tblVillas.deleted = 0)
0 голосов
/ 26 ноября 2008

Спасибо за вашу помощь

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

Msg 306, Level 16, State 2, Procedure spVillaGet, Line 22

Типы данных text, ntext и image нельзя сравнивать или сортировать, кроме случаев использования оператора IS NULL или LIKE. Сообщение 306, Уровень 16, Состояние 2, Процедура spVillaGet, Строка 22 Типы данных text, ntext и image нельзя сравнивать или сортировать, кроме случаев использования оператора IS NULL или LIKE.

...