2014-01-04 4 views
-1

Существует таблица в моей SQL Server называется Product и столбцы ID, NAME, YEAR, COSTYEAR в качестве входных данных

Образец данных:

ID NAME  YEAR   COST 
----------------------------------           
1  A  2006 05 03  4 
2  B  2006 04 01  5 
3  C  2001 05 01  6 
4  D  2002 05 02  7 
5  E  2003 04 01  8 

Я хочу взять только год в качестве входных данных, как 2006 как ввод, и я хочу, чтобы результат показывал всю добавленную стоимость этого года. Как я могу это сделать?

Ожидаемый результат:

ID NAME YEAR   TOTAL 
------------------------------- 
1  A  2006 05 03  9 
2  B  2006 02 01  9 
3  C  2001 05 01  6 
4  D  2002 05 02  7 
5  E  2003 04 01  8 
+2

Я не получить его на всех – Kirk

+0

себестоимости ввода год будет добавлен и будет отображаться как результат. – SaNa3819

ответ

0

с использованием суб-запрос:

SELECT ID, NAME, year, (select Sum(Cost) 
         from Product P1 
         where YEAR(P1.year) = YEAR(P2.year)) as Cost 
FROM Product P2 
WHERE YEAR(year) = 2006 --your parameter here 

демо здесь: http://sqlfiddle.com/#!3/9345d/10

хранимая процедура с параметром будет выглядеть следующим образом:

CREATE PROCEDURE ProcedureName 
    -- Add the parameters for the stored procedure here 
    @Year int 

AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 
    select ID, Name, year, (select Sum(Cost) 
         from Products P1 
         where YEAR(P1.year) = YEAR(P2.year)) as Cost 
    from Products P2 
    WHERE YEAR(year) = @Year 
END 
GO 
+0

Можно ли с помощью процедуры? – SaNa3819

+0

да, вы можете использовать параметры здесь, добавив 'WHERE' предложение – Milen

+0

извините, я его не получаю – SaNa3819

3

Использование sum() с over() пункта и раздела по year().

select T.ID, 
     T.Name, 
     T.Year, 
     sum(T.Cost) over(partition by year(T.Year)) as Cost 
from YourTable as T 

SUM (Transact-SQL)
OVER Clause (Transact-SQL)
YEAR (Transact-SQL)

SQL Fiddle

Фильтрация выше запрос от параметра @Year будет выглядеть следующим образом:

select T.ID, 
     T.Name, 
     T.Year, 
     sum(T.Cost) over() as Cost 
from YourTable as T 
where T.Year >= dateadd(year, @Year-1900, '19000101') and 
     T.Year < dateadd(year, @Year-1899, '19000101') 
+0

На самом деле я хочу взять год как вход. Как я могу это сделать? Поскольку я беру только 2006 год с года, но хочу получить результаты как с 2006-05-03, так и с 2006-04-01. Могу ли я использовать процедуру? – SaNa3819

+0

@ user3158245 Ваш ожидаемый вывод содержит все строки. Не хотите? –

+0

Да, я хочу этого, но главное, я хочу, чтобы сумма этого года использовалась с использованием процедуры, так как, когда я беру ввод, я дам общий год как «2006-05-03», и это займет всего 2006 год и, как результат показывает добавленную стоимость 2006-05-03 и 2006-04-01. – SaNa3819

Смежные вопросы