HAVING / GROUP BY子句中的非布尔类型问题

时间:2011-08-10 00:34:57

标签: sql sql-server sql-server-2008

我的指示是显示数量最多的INV_LINE_ITEM.FK_InvoiceNbr。

我一直在使用以下查询的不同变体:

SELECT INV_LINE_ITEM.FK_InvoiceNbr
FROM INV_LINE_ITEM
GROUP BY INV_LINE_ITEM.FK_InvoiceNbr
HAVING MAX(INV_LINE_ITEM.Quantity);

我一直收到错误“在预期条件的上下文中指定的非布尔类型的表达式,靠近';'”。我不确定这个错误意味着什么或如何修复我的代码。

我也尝试过使用:

SELECT 
STR(ILI.InvoiceNbr, 4) AS 'Invoice Number'
FROM INV_LINE_ITEM ILI
GROUP BY
ILI.FK_InvoiceNbr, ILI.Quantity
HAVING MAX(ILI.Quantity)

5 个答案:

答案 0 :(得分:3)

可能不是最有效的查询。查看以下查询是否有帮助。

SELECT TOP 1    FK_InvoiceNbr
            ,   MAX(Quantity)   AS MaxQuantity
FROM            INV_LINE_ITEM
GROUP BY        FK_InvoiceNbr
ORDER BY        MaxQuantity DESC

你也可以这样写。

SELECT TOP 1    FK_InvoiceNbr
FROM            INV_LINE_ITEM
GROUP BY        FK_InvoiceNbr
ORDER BY        MAX(Quantity) DESC

答案 1 :(得分:0)

我不确定你用这种方式使用MAX想要实现的目标。您应该知道MAX将为该组中的该列带来最大值,因此,其类型与其中的表达式相同。

正确的条款会像

一样
Having max(field) = 3

答案 2 :(得分:0)

您需要在MAX子句中添加一些内容,使其成为值为true或false的内容。

例如:

HAVING MAX(ILI.Quantity) > 1000

答案 3 :(得分:0)

有点像条件。语法就像这样

HAVING MAX(INV_LINE_ITEM.Quantity) > 3;

但那不是你想要的条件。

我认为你想要的是这个

SELECT INV_LINE_ITEM.FK_InvoiceNbr
FROM INV_LINE_ITEM
ORDER BY INV_LINE_ITEM.Quantity DESC
LIMIT 1

这将为您提供具有最高数量的INV_LINE_ITEM.FK_InvoiceNbr。

答案 4 :(得分:0)

HAVING正在检查有关您聚合的组的聚合属性的条件。

就像WHERE检查行上的条件一样,HAVING根据您在GROUP BY中指定的分组检查行聚合的条件。

通常这是为了向超过100名儿童或商店的学校展示价值超过1000美元的产品。

您似乎没有寻找 - 您正在寻找具有最大数量的集团(实际上甚至不是集团,但发票):

WITH x AS (
    SELECT INV_LINE_ITEM.FK_InvoiceNbr, RANK() (OVER BY INV_LINE_ITEM.Quantity DESC) AS rnk
    FROM INV_LINE_ITEM
)
SELECT * FROM x WHERE rnk = 1

如果它们与RANK相关,则会给出倍数。还有一个DENSE_RANK和一个ROW_NUMBER分析函数behave a little differently

如果您希望每张发票中的行数量最多:

WITH x AS (
    SELECT INV_LINE_ITEM.FK_InvoiceNbr, RANK() (OVER BY INV_LINE_ITEM.Quantity DESC PARTITION BY INV_LINE_ITEM.FK_InvoiceNbr) AS rnk
    FROM INV_LINE_ITEM
)
SELECT * FROM x WHERE rnk = 1