Агрегатная функция с неагрегированной функцией в команде выбора - PullRequest
0 голосов
/ 18 апреля 2019

Я занимаюсь кодированием в MS.SQL Server. У меня есть небольшая таблица ниже:

INV_NUM  INV_AMOUNT
-------  ----------
8000        235       
8001        312 
8002        528
8003        194
8004        619

Я хотел бы написать запрос для всех счетов, которые будут отображаться:

  • номер счета,
  • сумма счета,
  • средняя сумма счета и
  • разница между средней суммой счета и фактической суммой счета.

Мой код ниже:

SELECT I.INV_NUM,I.INV_AMOUNT,AVG(I.INV_AMOUNT) as AVERAGE,(AVG(INV_AMOUNT)-I.INV_AMOUNT) as DIFFER
FROM INVOICE I
GROUP BY I.INV_NUM,I.INV_AMOUNT;

Результат в MS SQL не сгенерировал значение avg, вместо этого он показывает значение INV_AMOUNT в каждой строке.

Результат:

INV_NUM  INV_AMOUNT    Average      Differ 
--------- ------------------------------------
8003     194            194            0
8000     235            235            0
8001     312            312            0
8002     528            528            0
8004     619            619            0
--------------- -------------------------------

Я обнаружил, что если у меня есть только одна строка в таблице, она работает нормально. Почему это случилось? Спасибо!

Ответы [ 2 ]

4 голосов
/ 18 апреля 2019

Вы можете использовать разные решения.Как отметил The Impaler, вы можете использовать оконные функции.Чтобы глубже вникнуть в этот способ реализации, вы должны прочитать некоторые учебники об этом.Другой способ - использование CTE.Сначала вы выберете среднюю сумму счета в качестве собственного запроса.После этого вы будете использовать его в «основном» запросе.Выглядит так:

WITH avg_inv AS
(
select avg(inv_amount) average
)
select
  inv_num,
  inv_amount,
  (select average from avg_inv) as average,
  (select average from avg_inv) - inv_amount as diff
from invoice;
4 голосов
/ 18 апреля 2019

Я думаю, вы хотите что-то вроде:

select
  inv_num,
  inv_amount,
  avg(inv_amount) over() as average,
  avg(inv_amount) over() - inv_amount as diff
from invoice

Ваш запрос группирует ваши строки как отдельные группы. Вместо этого вам нужно использовать оконную функцию для одной группы (используя OVER).

Результат:

inv_num  inv_amount  average  diff
-------  ----------  -------  ----
8000     235         377      142 
8001     312         377      65  
8002     528         377      -151
8003     194         377      183 
8004     619         377      -242
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...