Исправление вложенной агрегированной функции - PullRequest
0 голосов
/ 24 сентября 2019

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

Я пробовал несколько разных версий кода, но каждый раз, когда он говоритне могу вкладывать агрегированные операции

SELECT productid
FROM soldvia 
GROUP BY productid
WHERE productid IN (SELECT MAX(SUM(noofitems)) FROM soldvia GROUP BY productid);

Я ожидаю, что вывод будет PRODUCTID 3x3 4x4

Ответы [ 4 ]

3 голосов
/ 24 сентября 2019

Вы не можете вкладывать агрегаты.Используйте ORDER BY с TOP:

SELECT TOP 1 productid 
FROM soldvia 
GROUP BY productid
ORDER BY SUM(noofitems) DESC 
1 голос
/ 25 сентября 2019

В Teradata вы можете использовать предложение qualify:

SELECT productid
FROM soldvia 
GROUP BY productid
QUALIFY ROW_NUMBER() OVER (ORDER BY COUNT(*) DESC) = 1;

Это удобно.Вы можете получить дубликаты, изменив ROW_NUMBER() на RANK().На самом деле, RANK() более соответствует коду в вашем вопросе.

0 голосов
/ 24 сентября 2019

Ответ @forpas - это, вероятно, путь, но этот немного ближе к вашему:

SELECT productid
FROM soldvia
GROUP BY productid
HAVING SUM(noofitems) = (
        SELECT MAX(items)
        FROM (
            SELECT SUM(noofitems) AS items
            FROM soldvia
            GROUP BY productid
            ) x
        )
0 голосов
/ 24 сентября 2019

Пожалуйста, попробуйте запрос ниже для вашего точного ответа.

 select productid, sum(noofitems) as max_sold, 

 convert(varchar,productid) +' x '+ convert(varchar,sum(noofitems)) as

 output_sold from soldvia group by productid order by sum(noofitems) desc

Вывод будет

 ProductId  NoOfItemSold  Output_Sold
  1          7               1x7
  2          4               2x4
  3          1               3x1    
...