2009-11-13 126 views
68

我需要聲明12個十進制變量,對應於每個月的年份,使用遊標我將這些值總和到這個變量中,然後我更新一些銷售信息。如何在Sql Server存儲過程中聲明數組?

我不知道如果SQL Server有這句法

Declare MonthsSale(1 to 12) as decimal(18,2) 

此代碼的工作好。 !

CREATE PROCEDURE [dbo].[proc_test] 
AS 
BEGIN 

--SET NOCOUNT ON; 

DECLARE @monthsales TABLE (monthnr int, amount decimal(18,2) ) 


-- PUT YOUR OWN CODE HERE 


-- THIS IS TEST CODE 
-- 1 REPRESENTS JANUARY, ... 
INSERT @monthsales (monthnr, amount) VALUES (1, 100) 
INSERT @monthsales (monthnr, amount) VALUES (1, 100) 

INSERT @monthsales (monthnr, amount) VALUES (2, 200) 
INSERT @monthsales (monthnr, amount) VALUES (3, 300) 
INSERT @monthsales (monthnr, amount) VALUES (4, 400) 
INSERT @monthsales (monthnr, amount) VALUES (5, 500) 
INSERT @monthsales (monthnr, amount) VALUES (6, 600) 
INSERT @monthsales (monthnr, amount) VALUES (7, 700) 
INSERT @monthsales (monthnr, amount) VALUES (8, 800) 
INSERT @monthsales (monthnr, amount) VALUES (9, 900) 
INSERT @monthsales (monthnr, amount) VALUES (10, 1000) 
INSERT @monthsales (monthnr, amount) VALUES (11, 1100) 
INSERT @monthsales (monthnr, amount) VALUES (12, 1200) 


SELECT monthnr, SUM(amount) AS SUM_MONTH_1 FROM @monthsales WHERE monthnr = 1 GROUP BY monthnr 
SELECT monthnr, SUM(amount) AS SUM_MONTH_2 FROM @monthsales WHERE monthnr = 2 GROUP BY monthnr 
SELECT monthnr, SUM(amount) AS SUM_MONTH_3 FROM @monthsales WHERE monthnr = 3 GROUP BY monthnr 
SELECT monthnr, SUM(amount) AS SUM_MONTH_4 FROM @monthsales WHERE monthnr = 4 GROUP BY monthnr 
SELECT monthnr, SUM(amount) AS SUM_MONTH_5 FROM @monthsales WHERE monthnr = 5 GROUP BY monthnr 
SELECT monthnr, SUM(amount) AS SUM_MONTH_6 FROM @monthsales WHERE monthnr = 6 GROUP BY monthnr 
SELECT monthnr, SUM(amount) AS SUM_MONTH_7 FROM @monthsales WHERE monthnr = 7 GROUP BY monthnr 
SELECT monthnr, SUM(amount) AS SUM_MONTH_8 FROM @monthsales WHERE monthnr = 8 GROUP BY monthnr 
SELECT monthnr, SUM(amount) AS SUM_MONTH_9 FROM @monthsales WHERE monthnr = 9 GROUP BY monthnr 
SELECT monthnr, SUM(amount) AS SUM_MONTH_10 FROM @monthsales WHERE monthnr = 10 GROUP BY monthnr 
SELECT monthnr, SUM(amount) AS SUM_MONTH_11 FROM @monthsales WHERE monthnr = 11 GROUP BY monthnr 
SELECT monthnr, SUM(amount) AS SUM_MONTH_12 FROM @monthsales WHERE monthnr = 12 GROUP BY monthnr 

-- END TEST CODE 
END 

回答

123

你可以聲明表變量(聲明表類型的變量)

declare @MonthsSale table(monthnr int, totalsales tinyint) 

您可以更新像任何其他表的表變量:

update m 
set m.TotalSales = sum(s.SalesValue) 
from @MonthsSale m 
left join Sales s on month(s.SalesDt) = m.MonthNr 
7

T-SQL不支持我知道的數組。

什麼是你的表格結構?你也許可以設計一個查詢,這是否改爲:只要你喜歡

declare @MonthsSale table(monthnr int) 
insert into @MonthsSale (monthnr) values (1) 
insert into @MonthsSale (monthnr) values (2) 
.... 

您可以添加額外列:

select 
month, 
sum(sales) 
from sales_table 
group by month 
order by month 
+0

僅作爲一個側面評論,我會注意到語法T [n] .v比(從T選擇v,其中T.i = n)更簡潔一點。實際上,它更簡潔。我很想看到T-SQL添加它。 – debater 2015-08-07 13:21:46

22

是不是有一個原因,你沒有使用表變量和聚合SUM運算符,而不是遊標? SQL擅長面向集合的操作。那你會發現自己使用遊標時99.87%,有一個面向集合的替代方案,更高效:

declare @MonthsSale table 
(
MonthNumber int, 
MonthName varchar(9), 
MonthSale decimal(18,2) 
) 

insert into @MonthsSale 
select 
    1, 'January', 100.00 
union select  
    2, 'February', 200.00 
union select  
    3, 'March', 300.00 
union select  
    4, 'April', 400.00 
union select  
    5, 'May', 500.00 
union select  
    6, 'June', 600.00 
union select  
    7, 'July', 700.00 
union select  
    8, 'August', 800.00 
union select  
    9, 'September', 900.00 
union select  
    10, 'October', 1000.00 
union select  
    11, 'November', 1100.00 
union select  
    12, 'December', 1200.00 

select * from @MonthsSale 
select SUM(MonthSale) as [TotalSales] from @MonthsSale 
+8

顯然,在MSSQL2012中,您現在可以按以下格式插入: VALUES(1,'January',100.00),(2,'February',200.00) - source:http://blog.sqlauthority.com/2012/10/ 27/sql-server-storage-variable-values-in-temporary-array-or-temporary-list/ – andrewb 2013-09-13 01:15:42

+2

此功能完全避免了我的注意;顯然這也適用於SQL 2008。 – 2013-09-13 14:44:50

1

大問題和偉大的想法,但在SQL你需要這樣做:

對於數據類型日期時間,像這個 -

declare @BeginDate datetime = '1/1/2016', 
     @EndDate  datetime = '12/1/2016' 
create table #months (dates datetime) 
declare @var datetime = @BeginDate 
    while @var < dateadd(MONTH, +1, @EndDate) 
    Begin 
      insert into #months Values(@var) 
      set @var = Dateadd(MONTH, +1, @var) 
    end 

如果你真正想要的是一個數字,這 - 做

create table #numbas (digit int) 
declare @var int = 1  --your starting digit 
    while @var <= 12  --your ending digit 
    begin 
     insert into #numbas Values(@var) 
     set @var = @var +1 
    end