Himanshu Jain Ответов: 1

Объедините результаты из нескольких наборов результатов оператора select в одну запись в таблице


У меня очень специфическая проблема.

Мне нужно получить EmployeeID, UserID, сумму TotalValue и сумму COUNT столбцов StartDate в виде одной записи из моей хранимой процедуры.

Сценарий :

Что я уже пробовал:

Если я попробую это сделать :

Select EmployeeID, UserID, Sum(TotalValue), Sum(Count(StartDate))
From Employees
Group By EmployeeID, UserID

Проблема в том, что я не могу суммировать и считать одновременно, так как это дает мне следующую ошибку :

Невозможно выполнить агрегатную функцию для выражения, содержащего агрегат или подзапрос
И вот что я сделал :

Select EmployeeID, UserID, TotalSummedValue, SUM(NoOfDates) FROM
(
 Select EmployeeID, UserID, SUM(TotalValue) AS TotalSummedValue, COUNT(StartDate)
 FROM Employees
 GROUP BY EmployeeID, UserID
) AS inner
GROUP BY EmployeeID, UserID

Но теперь проблема заключается в том, что значение, возвращаемое COUNT(StartDate), зависит от группировки во внутреннем запросе. Поэтому мне, по сути, приходится извлекать счетчик и остальные данные отдельно.

Поэтому я сделал базовый запрос (это упрощенная версия фактического запроса), результаты которого я вставляю во временную таблицу и повторно использую ->

Insert Into #TempBase
SELECT EmployeeID, UserID, TotalValue, StartDate FROM Employees

И используйте его вот так :

Insert INTO #Temp2
Select EmployeeID, UserID, SUM(TotalValue) AS TotalSummedValue FROM #TempBase

Insert INTO #Temp3
Select SUM(NoOfDates) FROM
(
 Select COUNT(StartDate) AS NoOfDates FROM
 #TempBase
)

И затем, чтобы все это было записано в одной записи, я сейчас делаю эту уродливую вещь :

Insert INTO #Temp4 (EmployeeID, UserID, TotalSummedValue, TotalDays)
Values((Select EmployeeID FROM #Temp2), (Select UserID FROM #Temp2),
(Select TotalSummedValue FROM #Temp2),(Select NoOfDates FROM #Temp3))

Select * from #Temp4

Я хотел бы знать, есть ли лучший способ сделать это.

Peter Leow

Счетчик (StartDate) даст вам общее количество доступных StartDate, зачем снова суммировать? Можете ли вы показать какой-нибудь пример вывода?

jamuro77

Вы не можете группировать два раза по одним и тем же полям. В этом нет никакого смысла. Вы можете получить "счет " или" сумму " отдельно, но не вместе. Я думаю, что вам нужно поле, не группирующееся по EmployeeID и UserID. Для выработки решения потребуются ожидаемые результаты...

1 Ответов

Рейтинг:
2

OriginalGriff

Ваш код:

Select COUNT(StartDate) AS NoOfDates FROM #Tempbase

Возвращает одно целое значение: количество строк во временной таблице.
Так:
Select SUM(NoOfDates) FROM
(
 Select COUNT(StartDate) AS NoOfDates FROM
 #TempBase
)
Сложит все одно из значений и вернет точно такое же значение - одно целое число, которое является количеством строк в вашей временной таблице.
Только время SUM(COUNT(x)) может быть полезно, если счетчик возвращает несколько строк, например, когда он обрабатывает предложение GROUP BY - что вы конкретно говорите, это не то, что вы хотите, - и SQL не будет жаловаться, если вы это сделаете, потому что вы не будете пытаться "выполнить агрегатную функцию над выражением, содержащим агрегат", поскольку GROUP BY будет возвращать строки, а не агрегированный результат.

Так почему же вы все равно пытаетесь суммировать счетчик - если вы не группируете и не фильтруете строки, он не возвращает ничего, что каким-либо образом отличается от самого значения счетчика.