Выбор одной записи при группировке на основе мин - PullRequest
0 голосов
/ 04 ноября 2019
SELECT DISTINCT
       invoice.CustomerRef_FullName AS [Name Invoice],
       receivepayment.CustomerRef_FullName AS [Name RP],
       invoice.RefNumber AS Invoice#,
       receivepayment.RefNumber AS Expr1,
       invoice.AppliedAmount,
       invoice.BalanceRemaining,
       MIN(receivepayment.TotalAmount),
       invoice.TimeCreated
FROM receivepayment
     INNER JOIN invoice ON receivepayment.CustomerRef_FullName = invoice.CustomerRef_FullName
GROUP BY receivepayment.RefNumber;

пытается сделать этот запросreceivepayment.TotalAmount - десятичное число. Две таблицы, связанные с CustomerRef_FullName и его varchar.

Это дает мне ошибку

Сообщение 8120, уровень 16, состояние 1, строка 4 столбца 'invoice.CustomerRef_FullName' недопустимо в списке выборапотому что он не содержится ни в статистической функции, ни в предложении GROUP BY

Ответы [ 3 ]

0 голосов
/ 04 ноября 2019

Каждый столбец в вашем предложении SELECT должен быть: (a) вызовом совокупной функции, например MIN, или (b) перечисленным в предложении GROUP BY.

Подумайте о том, что вы спросили .. Вы говорите «Покажите мне транзакции, сгруппированные по RefNumber», но один из выбранных вами столбцов - invoice.CustomerRef_FullName. Что если в RefNumber больше одного invoice.CustomerRef_FullName? Например, клиент мог бы изменить свое имя в какой-то момент, и в его счетах было бы 2 имени.

В этом случае «нормальным» решением было бы использование всех столбцов, кроме вызова и списка функций MINих в предложении GROUP BY. Несколько более странное решение - преобразовать все поля в предложении SELECT в агрегированные вызовы функций, такие как FIRST.

0 голосов
/ 04 ноября 2019

Вы можете найти APPLY полезным здесь. Если вам нужна информация о минимальном платеже для каждого счета:

SELECT i.CustomerRef_FullName AS [Name Invoice],
       rp.CustomerRef_FullName AS [Name RP],
       i.RefNumber AS Invoice#,
       rp.RefNumber AS Expr1,
       i.AppliedAmount,
       i.BalanceRemaining,
       rp.TotalAmount,
       i.TimeCreated
FROM invoice i APPLY
     (SELECT TOP (1) rp.*
      FROM receivepayment rp
      WHERE rp.CustomerRef_FullName = i.CustomerRef_FullName
      ORDER BY rp.TotalAmount ASC
     ) rp;
0 голосов
/ 04 ноября 2019

Вам не нужно различать группу по

Вам нужны все столбцы, не включенные в функцию агрегации, упомянутые в группе как

    SELECT 
       invoice.CustomerRef_FullName AS [Name Invoice],
       receivepayment.CustomerRef_FullName AS [Name RP],
       invoice.RefNumber AS Invoice#,
       receivepayment.RefNumber AS Expr1,
       invoice.AppliedAmount,
       invoice.BalanceRemaining,
       MIN(receivepayment.TotalAmount),
       invoice.TimeCreated
FROM receivepayment
INNER JOIN invoice ON receivepayment.CustomerRef_FullName = invoice.CustomerRef_FullName
GROUP BY invoice.CustomerRef_FullNam ,
       receivepayment.CustomerRef_FullName ,
       invoice.RefNumber ,
       receivepayment.RefNumber,
       invoice.AppliedAmount,
       invoice.BalanceRemaining,
        invoice.TimeCreated

, или для получения всех нужных столбцовподзапрос или объедините значение min с соответствующей строкой

SELECT 
       invoice.CustomerRef_FullName AS [Name Invoice],
       receivepayment.CustomerRef_FullName AS [Name RP],
       invoice.RefNumber AS Invoice#,
       invoice.AppliedAmount,
       invoice.BalanceRemaining,
       invoice.TimeCreated
FROM receivepayment
INNER JOIN invoice ON receivepayment.CustomerRef_FullName = invoice.CustomerRef_FullName
INNER JOIN  (
  SELECT 
         receivepayment.RefNumber AS Expr1,
         MIN(receivepayment.TotalAmount) min_tot,
         invoice.TimeCreated
  FROM receivepayment
       INNER JOIN invoice ON receivepayment.CustomerRef_FullName = invoice.CustomerRef_FullName
  GROUP BY receivepayment.RefNumber;
) t on t.min_tod = receivepayment.TotalAmount 
      AND  receivepayment.RefNumber = t.Expr1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...