2015-05-24 3 views
4

Я пытаюсь найти самый упорядоченный пункт меню в таблице, посчитав вхождения их идентификатора элемента. Я пробовал несколько разных вещей, но я довольно потерян. Это вызвало ошибку:SQL: найти наивысшее значение столбца в таблице?

"An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference."

Однако я думаю, что это ставит в перспективе, что я пытаюсь достичь:

SELECT count(itemCode) 
FROM OrderProcessing 
WHERE count(itemCode)=max(count(itemCode)) 

ответ

5

I. модифицированная версия оригинального запроса (UPDATE после @DanGuzman комментария о связях)

выбрать все элементы с таким же кол, как самый разыскиваемый пункт:

SELECT itemCode , count(*) as MaxCount 
FROM OrderProcessing 
GROUP BY itemCode 
HAVING count(*) = 
-- count of most wanted item 
(select top 1 count(*) 
from OrderProcessing 
group by itemCode 
order by count(*) desc) 

II. запрос, чтобы выбрать один из наиболее упорядоченных элементов

SELECT top 1 itemCode --, count(*) as MaxCount --optional 
FROM OrderProcessing 
GROUP BY itemCode 
ORDER BY count(*) DESC 
+0

Как насчет связей? –

+0

@DanGuzman, справа, 'top 1' будет игнорировать связи.я должен улучшить решение сейчас – ASh

+0

ваши запросы просто возвращают максимальное количество вхождений, но OP хочет элементы этого, попробуйте этот SELECT MAX (cnt) FROM (SELECT COUNT (*) cnt FROM OrderProcessing GROUP BY itemCode) dt' для этого точка;). –

1

Это еще один способ сделать это:

SELECT OP.itemCode 
FROM (
    SELECT OP.itemCode, OP.TotalRows, MAX(TotalRows) OVER() AS MaxRows 
    FROM (
     SELECT OP.itemCode, COUNT(*) AS TotalRows 
     FROM dbo.OrderProcessing AS OP 
     GROUP BY OP.itemCode 
    ) AS OP 
) AS OP 
WHERE OP.TotalRows = OP.MaxRows; 

Это не выглядит очень красиво, но это может привести к улучшению плана выполнения (направление сортировки действительно ресурсоемкая статья).

Он также должен возвращать вам результаты, даже если есть более одного пункта меню с таким же вхождением.

3

Если вы хотите одну строку, я хотел бы предложить order by:

SELECT TOP 1 itemCode, count(itemCode) 
FROM OrderProcessing 
GROUP BY itemCode 
ORDER BY count(itemCode); 

Если вы хотите, чтобы все элементы с максимальным числом, используйте WITH TIES:

SELECT TOP 1 WITH TIES itemCode, count(itemCode) 
FROM OrderProcessing 
GROUP BY itemCode 
ORDER BY count(itemCode); 

Если вы хотите быть фантазии, использовать оконные функции. Вот пример:

SELECT itemCode, cnt 
FROM (SELECT itemCode, count(itemCode) as cnt, 
      MAX(count(itemCode)) OVER() as maxcnt 
     FROM OrderProcessing 
     GROUP BY itemCode 
    ) op 
WHERE cnt = maxcnt; 
+0

@ shA.t. , , Спасибо. –

1

Я использую этот запрос, чтобы найти элементы, которые имеют наибольшее появление:

SELECT t.* 
FROM OrderProcessing t 
    JOIN 
    (SELECT itemCode, ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) seq 
    FROM OrderProcessing 
    GROUP BY itemCode) dt 
    ON t.itemCode= dt.itemCode 
WHERE dt.seq = 1 

И этот запрос, чтобы найти, что количество самого высокого появления:

SELECT MAX(cnt) 
FROM (SELECT COUNT(*) cnt 
     FROM OrderProcessing 
     GROUP BY itemCode) dt 
1

A where, которое содержит результаты агрегирования, называется предложением having. Однако вы не можете встраивать функции агрегации: Max (Count (*)).

Но вы можете сложить их. Использование CTE подходит для этого:

with 
Data(ItemID)as(
    select 1 union all 
    select 2 union all 
    select 2 union all 
    select 3 union all 
    select 3 union all 
    select 3 
), 
Sums(ItemID, TotalSold)as(
    select ItemID, Count(*) 
    from Data 
    group by ItemID 
) 
select * 
from Sums 
where TotalSold =(
    select Max(TotalSold) 
    from Sums); 

Это отобразит все элементы с наибольшим количеством транзакций. Однако из-за того, что этот запрос, как предполагается, отвечает, я должен подумать, что показать все связи будет правильным результатом. Если элементы X и Y проданы больше всего, отправьте Item X в качестве ответа, то по существу все остальные предметы, включая Item Y, продаются меньше. Это не правильный ответ. Я хотел бы обсудить это с вашим аналитиком или тем, кто просит этот результат.

Смежные вопросы