SQL-запрос для получения суммы значений, сгруппированных по другому столбцу

#sql-server #tsql #sql-server-2012 #group-by

#sql-сервер #tsql #sql-server-2012 #группировать по

Вопрос:

У меня есть этот результат:

введите описание изображения здесь

Запрос, который я использую в настоящее время, является:

 SELECT TOP 1000 [FundReportLoanDataID]
      ,[SegAmortisation]
      ,frlc.FundReportCategoryId,
      SUM(CurrentLB) AS '% of Fund'
  FROM [dbo].[FundReportLoanData] frld
  INNER JOIN [dbo].[FundReportCategories] frlc
  ON frld.SegAmortisation = frlc.Description
    group by frlc.FundReportCategoryId, frld.SegAmortisation, frld.FundReportLoanDataID, frld.LoanId, frld.CurrentLB
  

Как вы можете видеть, хотя я группирую по FundReportCategoryId, есть несколько результатов с одинаковым идентификатором, но я хочу, чтобы все они были помещены в один итоговый результат на основе FundReportCategoryId.

Что мне нужно изменить, чтобы достичь того, что я ищу?

Комментарии:

1. Просто удалите FundReportLoanDataID из select amp; group by? есть ли здесь что-то более сложное, о чем вы не упомянули…

2. Это то, что у меня есть после вашего совета i.gyazo.com/5415081ac5af1d49c2e5fee971568e12.png

3. Не могли бы вы, пожалуйста, указать ожидаемый результат

4. Я хотел бы получить сумму CurrentLB как ‘% от фонда’ на основе FundReportCategoryId. Спасибо @j.t.

5. Задавая подобные вопросы, используйте пример данных, а затем то, что вы ожидаете.

Ответ №1:

Вы пытаетесь суммировать, CurrentLB и в Group by добавляется один и тот же столбец, что также является причиной дубликатов. Удалите frld.CurrentLB из Group by

Также вам нужно удалить FundReportLoanDataID из SELECT и group by , потому что данные выглядят уникальными для каждой строки.

 ...
group by frld.SegAmortisation, 
         frld.FundReportLoanDataID
  

Удалено frld.LoanId также из Group By , поскольку вы его не выбрали, что также может быть причиной дублирования

Комментарии:

1. Снова тот же результат.

2. @Laziale — проверьте сейчас

Ответ №2:

Если я правильно понимаю, вы ищете процент от каждого FundReportCategoryId. Если это так, вы можете использовать функции window

 SELECT TOP 1000 [FundReportLoanDataID]
      ,[SegAmortisation]
      ,frlc.FundReportCategoryId,
      SUM(CurrentLB)/SUM(CurrentLB) OVER(PARTITION BY frlc.FundReportCategoryId ) AS '% of Fund'
  FROM [dbo].[FundReportLoanData] frld
  INNER JOIN [dbo].[FundReportCategories] frlc
  ON frld.SegAmortisation = frlc.Description
  group by frlc.FundReportCategoryId, frld.SegAmortisation, frld.FundReportLoanDataID, frld.LoanId, frld.CurrentLB
  

Комментарии:

1. Привет @john, Не могли бы вы, пожалуйста, написать весь запрос еще раз, я не получаю ожидаемого результата

2. Это то, что я получаю в столбце ‘dbo.FundReportLoanData. Значение CurrentLB’ недопустимо в списке выбора, поскольку оно не содержится ни в агрегатной функции, ни в предложении GROUP BY.

3. @Laziale Обновлено При условии, что изображение соответствует вашему желанию, за исключением последнего столбца в процентах

4. i.gyazo.com/4c4fbfec868ef06e43109d58333a0553.png это то, что я получаю сейчас

5. Как вы можете видеть, я все еще получаю несколько записей для одного и того же FundReportCategoryId

Ответ №3:

Попробуйте это

     SELECT TOP 1000 
        [SegAmortisation],
        frlc.FundReportCategoryId,
        SUM(CurrentLB) AS '% of Fund'
    FROM [dbo].[FundReportLoanData] frld
    INNER JOIN [dbo].[FundReportCategories] frlc
        ON frld.SegAmortisation = frlc.Description
    GROUP BY frld.SegAmortisation, frlc.FundReportCategoryId
  

В следующий раз, пожалуйста, предоставьте желаемый результат 🙂