sql - 使用聚合函数(最小值/最大值)作为选择语句的一部分
Posted
技术标签:
【中文标题】sql - 使用聚合函数(最小值/最大值)作为选择语句的一部分【英文标题】:sql - Using aggregate functions (min/max) as part of select statement 【发布时间】:2010-09-24 03:08:03 【问题描述】:我正在尝试返回别墅预订系统的最低和最高价格。我有一个查找表,存储每个别墅每周的价格。
我在选择中使用 min 和 max 函数来执行此操作,但我遇到了很多问题。谁能解释我哪里出错了?这是sp
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
作为 开始 -- 添加了 SET NOCOUNT ON 以防止额外的结果集 -- 干扰 SELECT 语句。 设置无计数;
-- 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
【问题讨论】:
需要更多关于您遇到的错误的详细信息 您面临哪些问题、错误? 【参考方案1】:您没有详细说明您遇到的什么问题,但这可能是一个问题:您需要在 GROUP BY 子句中指定 all 非聚合列即:
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)
【讨论】:
【参考方案2】:感谢您的帮助
当我分组并包含选择中的所有列时,除了两个函数之外,我收到以下错误
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 运算符。
【讨论】:
我已经更新了我对此的回答。注意,您不应该真正提交“答案”来澄清您的问题 - 您应该更新问题和/或评论我的答案。 他还没有发布 cmets 的代表,但你说得对,改变他的问题会更好。以上是关于sql - 使用聚合函数(最小值/最大值)作为选择语句的一部分的主要内容,如果未能解决你的问题,请参考以下文章