MS SQL सर्वर संग्रहीत कार्यविधि के अंदर एक सरणी घोषित करने के लिए कैसे?


85

मुझे प्रत्येक महीने के वर्ष के अनुरूप 12 दशमलव चर घोषित करने की आवश्यकता है, एक कर्सर के साथ मैं इस चर को मान देता हूं, फिर बाद में मैं कुछ बिक्री जानकारी अपडेट करता हूं।

मुझे नहीं पता कि sql सर्वर में यह सिंटैक्स है

 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

जवाबों:


143

आप एक तालिका चर घोषित कर सकते हैं (प्रकार तालिका के एक चर की घोषणा):

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

आप अपनी पसंद के अनुसार अतिरिक्त कॉलम जोड़ सकते हैं:

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

26

क्या कोई कारण है कि आप एक कर्सर के बजाय टेबल चर और कुल 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

12
जाहिर है MSSQL2012 में आप अब इस प्रारूप में सम्मिलित कर सकते हैं: मान (1, जनवरी ', 100.00), (2,' फ़रवरी ', 200.00) - स्रोत: blog.sqlauthority.com/2012/10/27/...
andrewb

3
यह सुविधा पूरी तरह से मेरे नोटिस से बच गई; जाहिरा तौर पर यह SQL 2008 में भी काम करता है।
पॉल स्मिथ

8

T-SQL उन सरणियों का समर्थन नहीं करता है जिनके बारे में मुझे पता है।

आपकी तालिका संरचना क्या है? आप शायद एक क्वेरी डिज़ाइन कर सकते हैं जो इसके बजाय ऐसा करती है:

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

केवल एक साइड-कमेंट के रूप में, मैं सिंटैक्स T [n] को नोट करूंगा। यह थोडा अधिक संक्षिप्त है (T से जहाँ v = सिलेक्ट करें t = n)। वास्तव में, यह बहुत अधिक संक्षिप्त है। मैं टी-एसक्यूएल को जोड़कर देखना काफी पसंद करूंगा।
डेब्यू

3

महान प्रश्न और महान विचार, लेकिन 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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.