#tsql
#tsql
Вопрос:
create proc sp_SumVirtual
as
select a.year, sum(b.PriceDay*b.AmmountDays) profit
from vehicles a, rent b
where a.Matriculation = b.Matriculation
GROUP BY a.year
Итак, с этим я получил сумму денег, заработанную КАЖДОЙ машиной, но мне нужна вся сумма. Итак, есть ли способ получить SUM из прибыли виртуальной таблицы? Потому что это все, что мне нужно .. или вы предлагаете другой способ?
Комментарии:
1. Это говорит вам, сколько каждый год, а не сколько каждая машина — просто говорю
2. Это было бы проще, если бы это был udf вместо proc — возможно ли это? Процедуры — это боль для манипулирования результатами внутри TSQL
Ответ №1:
Используйте WITH ROLLUP
GROUP BY
предложение on your:
SELECT
a.year, SUM(b.PriceDay*b.AmmountDays) profit
FROM
dbo.vehicles a
INNER JOIN
dbo.rent b ON a.Matriculation = b.Matriculation
GROUP BY
a.year WITH ROLLUP
Это даст вам дополнительную строку в NULL
качестве значения year
, а значение в столбце sum будет общей суммой по всем сгруппированным строкам.
Обновление: итак, вы хотите иметь сумму за каждый год, а также другой столбец с общей суммой по всем строкам за все годы??
Попробуйте это:
SELECT
a.year,
SUM(b.PriceDay*b.AmmountDays) profit,
(SELECT SUM(b2.PriceDay * b2.AmountDays)
FROM dbo.vehicles a2
INNER JOIN dbo.rent b2 ON a2.Matriculation = b2.Matriculation) AS TotalProfit
FROM
dbo.vehicles a
INNER JOIN
dbo.rent b ON a.Matriculation = b.Matriculation
GROUP BY
a.year
ОДНАКО: это будет работать НЕ очень хорошо, поскольку вы вычисляете TotalProfit
снова и снова — для каждой строки, которая будет выводиться…..
Комментарии:
1. Я все перепутал, так как я испанский, и мне пришлось удалить многие вещи из процесса, чтобы сделать его проще .. и у меня могли быть какие-то ошибки там.. Но что мне действительно нужно в этой процедуре, так это предоставить мне НОВЫЙ СТОЛБЕЦ с суммой строк прибыли .. БОЛЬШОЕ ВАМ СПАСИБО! КСТАТИ..
2. «sum(b2.PriceDay * b2.AmountDays) over()» вместо подзапроса проще и должен быть более эффективным
Ответ №2:
Select v.year, Sum(r.PriceDay*r.AmmountDays) profit
From vehicles v Join rent r
On r.Matriculation = v.Matriculation
Group By v.year
With RollUp
Ответ №3:
Вы могли бы использовать временную таблицу вместе с UNION ALL:
SELECT
a.year, SUM(b.PriceDay*b.AmmountDays) profit
INTO #Temp
FROM
dbo.vehicles a
INNER JOIN
dbo.rent b ON a.Matriculation = b.Matriculation
GROUP BY
a.year
SELECT *
FROM #Temp
UNION ALL
SELECT year, Sum(profit)
FROM #Temp
Group by year