এমএস এসকিউএল সার্ভার সঞ্চিত পদ্ধতিতে কীভাবে অ্যারে ঘোষণা করবেন?


85

আমি প্রতিটি দশকের বছরের সাথে 12 ডেসিমাল ভেরিয়েবলগুলি ঘোষণা করতে হবে, একটি কার্সার দিয়ে আমি এই ভেরিয়েবলের সাথে মানগুলি যোগ করি, তারপরে আমি কিছু বিক্রয় তথ্য আপডেট করি।

এসকিএল সার্ভারে এই সিনট্যাক্স আছে কিনা তা আমি জানি না

 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

আপনি কার্সারের পরিবর্তে কোনও টেবিল ভেরিয়েবল এবং সমষ্টিগত এসএমএম অপারেটরটি ব্যবহার করছেন না এমন কোনও কারণ আছে কি? এসকিউএল সেট-ভিত্তিক ক্রিয়াকলাপগুলিতে অসাধারণ। আপনি যখন কার্সার ব্যবহার করে নিজেকে 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
স্পষ্টতই এমএসএসকিউএল ২০১২ তে আপনি এখন এই ফর্ম্যাটটি সন্নিবেশ করতে পারেন: ভ্যালু (1, 'জানুয়ারী', 100.00), (2, 'ফেব্রুয়ারি', 200.00) - উত্স: blog.sqlauthority.com/2012/10/27/…
অ্যান্ড্রুব

4
এই বৈশিষ্ট্যটি আমার নজরে পুরোপুরি এড়িয়ে গেছে; স্পষ্টতই এটি এসকিউএল 2008 তেও কাজ করে।
পল স্মিথ

8

টি-এসকিউএল অ্যারেগুলিকে সমর্থন করে না যা আমি সচেতন।

আপনার টেবিল কাঠামো কি? আপনি সম্ভবত একটি কোয়েরি ডিজাইন করতে পারেন যা পরিবর্তে এটি করে:

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

কেবলমাত্র একটি পার্শ্ব-মন্তব্য হিসাবে, আমি সিনট্যাক্স টি [n] নোট করব vv তুলনায় কিছুটা আরও সংক্ষিপ্ত (টি থেকে ভি নির্বাচন করুন যেখানে টি = এন)। আসলে, এটি অনেক বেশি সংক্ষিপ্ত। আমি টি-এসকিউএল এটি যুক্ত দেখতে বেশ চাই।
বিতর্ককারী

3

দুর্দান্ত প্রশ্ন এবং দুর্দান্ত ধারণা, তবে এসকিউএল এ আপনাকে এটি করতে হবে:

ডেটা টাইপের ডেটটাইমের জন্য, এরকম কিছু-

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.