#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
В следующий раз, пожалуйста, предоставьте желаемый результат 🙂