MS SQL Server Depolanan Prosedür içinde bir dizi nasıl bildirilir?


85

Her ayın yılına karşılık gelen 12 ondalık değişken bildirmem gerekiyor, bir imleçle bu değişkenlere değer toplamıyorum, sonra bazı satış bilgilerini güncelliyorum.

Sql sunucusunun bu sözdizimine sahip olup olmadığını bilmiyorum

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

Bu kod iyi çalışıyor. !

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

Yanıtlar:


143

Bir tablo değişkeni tanımlayabilirsiniz (tablo türünde bir değişken bildirmek):

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

İstediğiniz gibi ekstra sütunlar ekleyebilirsiniz:

declare @MonthsSale table(monthnr int, totalsales tinyint)

Tablo değişkenini diğer herhangi bir tablo gibi güncelleyebilirsiniz:

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

26

İmleç yerine tablo değişkeni ve toplam TOPLA operatörü kullanmamanızın bir nedeni var mı? SQL, küme odaklı işlemlerde üstündür. Kendinizi bir imleç kullanırken bulduğunuz zamanın% 99,87'sinde, daha verimli olan küme odaklı bir alternatif vardır:

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

12
Görünüşe göre MSSQL2012'de artık şu biçimde ekleyebilirsiniz: VALUES (1, 'January', 100.00), (2, 'February', 200.00) - kaynak: blog.sqlauthority.com/2012/10/27/…
andrewb

3
Bu özellik dikkatimi tamamen kaçırdı; görünüşe göre bu SQL 2008'de de çalışıyor.
Paul Smith

8

T-SQL bildiğim dizileri desteklemiyor.

Masa yapınız nedir? Muhtemelen bunun yerine bunu yapan bir sorgu tasarlayabilirsiniz:

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

Sadece bir yan yorum olarak, T [n] .v sözdiziminin biraz daha özlü olduğunu not ederim (Ti = n olduğunda T'den v'yi seçin). Aslında çok daha özlü. T-SQL'in onu eklediğini görmek isterim.
tartışmacı

3

Harika bir soru ve harika bir fikir, ancak SQL'de bunu yapmanız gerekecek:

Datetime veri türü için şunun gibi bir şey:

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

Gerçekten tek istediğin sayılarsa, bunu yap-

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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.