Как выбрать только столбец из моего подзапроса с агрегатной функцией? - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть данные в следующем формате.

enter image description here

Q. Найдите средний и общий доход по каждой подкатегории для категорий, которые входят в число 5 лучших категорий с точки зрения проданного количества.

Я написал код, упомянутый ниже.

Теперь я знаю, что мой подзапрос имеетагрегатная функция и столбец, который я хочу. Я хочу, чтобы выходные данные представляли собой только столбец "PROD_CAT_CODE", но я также хотел бы получить сумму количеств в подзапросе, поскольку она помогает мне узнать код продукта prod cat с большинством проданных количеств.

SELECT      PROD_SUBCAT_CODE, SUM(TOTAL_AMT)[SUM], AVG(TOTAL_AMT)[AVG]
FROM        TRANSACTIONS
WHERE       PROD_CAT_CODE = (
                            SELECT      
                            TOP 5       PROD_CAT_CODE, SUM(T1.QTY) [Quantity Sold]
                            FROM        TRANSACTIONS
                            GROUP BY    PROD_CAT_CODE
                            ORDER BY    SUM(T1.QTY)
                            DESC
                            )
GROUP BY    PROD_SUBCAT_CODE
ORDER BY    PROD_SUBCAT_CODE

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 09 ноября 2019

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

  SELECT      PROD_SUBCAT_CODE, SUM(TOTAL_AMT)[SUM], AVG(TOTAL_AMT)[AVG]
  FROM        TRANSACTIONS
  INNER JOIN (
        SELECT      
        TOP 5       PROD_CAT_CODE, SUM(T1.QTY) [Quantity Sold]
        FROM        TRANSACTIONS
        GROUP BY    PROD_CAT_CODE
        ORDER BY    SUM(T1.QTY)
        DESC
        ) T ON T.PROD_CAT_CODE = TRANSACTIONS.PROD_CAT_CODE
  GROUP BY    PROD_SUBCAT_CODE
  ORDER BY    PROD_SUBCAT_CODE
0 голосов
/ 09 ноября 2019

Я бы использовал оконные функции. Вот один из методов:

select top (1) with ties prod_cat_code, prod_subcat_code,
       total_amt, avg_total_amt
from (select prod_cat_code, prod_subcat_code, sum(total_amt) as total_amt,
             avg(total_amt) as avg_total_amt,
             sum(sum(qty)) over (partition by prod_cat_code) as category_sum
      from transactions t
      group by prod_cat_code, prod_subcat_code
     ) cs
order by dense_rank() over (order by category_sum desc, prod_cat_code);

РЕДАКТИРОВАТЬ:

Вы также можете принять ваш подход. Вашему запросу просто необходимо несколько исправлений:

SELECT PROD_CAT_CODE, PROD_SUBCAT_CODE,
       SUM(TOTAL_AMT) as [SUM], AVG(TOTAL_AMT) as [AVG]
FROM TRANSACTIONS t
WHERE t.PROD_CAT_CODE IN (SELECT TOP 5 t2.PROD_CAT_CODE
                          FROM TRANSACTIONS t2
                          GROUP BY t2.PROD_CAT_CODE
                          ORDER BY SUM(T2.QTY) DESC
                         )
GROUP BY PROD_CAT_CODE, PROD_SUBCAT_CODE
ORDER BY PROD_CAT_CODE, PROD_SUBCAT_CODE;

Основные проблемы с вашим запросом:

  • Используйте IN вместо = с подзапросом.
  • Вернуть только один столбец с подзапросом.
  • Включить PROD_CAT_CODE во внешний запрос как для SELECT, так и GROUP BY.
  • . Использовать псевдонимы таблиц для различенияссылки на таблицы в подзапросе и внешнем запросе.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...