Проблема с небулевыми типами в предложении HAVING / GROUP BY - PullRequest
0 голосов
/ 10 августа 2011

Мои инструкции для отображения 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 ]

3 голосов
/ 10 августа 2011

Может быть не самый эффективный запрос.Посмотрите, поможет ли следующий запрос.

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
0 голосов
/ 10 августа 2011

HAVING проверяет условие об агрегированных атрибутах групп, по которым вы агрегируете.

Так же, как ГДЕ проверяет условия по строкам, HAVING проверяет условия по агрегатам строк в соответствии с группировкой, указанной вyour 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, которые ведут себя немного иначе .

Если вы хотите, чтобы строка в каждом счете-фактуре имела наибольшее количество:

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
0 голосов
/ 10 августа 2011

Иметь такие же условия.Синтаксис должен выглядеть следующим образом:

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, который имеет наибольшее количество.

0 голосов
/ 10 августа 2011

Вам нужно добавить что-то в ваше предложение MAX, чтобы сделать его чем-то, что оценивается как true или false.

Например:

HAVING MAX(ILI.Quantity) > 1000
0 голосов
/ 10 августа 2011

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

Правильный пункт будет выглядеть примерно так:

Having max(field) = 3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...