TSQL — Как мне использовать SUM в виртуальном СТОЛБЦЕ внутри select?

#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