کوئری ستون مبلغ
با سلام و خسته نباشید
چگونه میتوانیم ستونی تجمیعی (ستون Jam) حاصل از جمع و تفریق رکوردهای سطر جاری بصورت بشکل زیر داشته باشیم. (بدون اینکه ستون Jam در جدول وجود داشته باشد) کوئری مورد نظر را چگونه بنویسیم؟ با تشکر
2 پاسخ
با سلام، برای گرفتن نتیجه مورد نظر می تونید از کوئری زیر الگو بگیرید، کوئری زیر رو به صورت کامل کپی کنید و اجرا کنید خروجی رو دریافت می کنید، چون از Temp Table ها استفاده شده و بدون مشکل اجرا میشه، برای گرفتن خروجی مورد نظر شما از Cursor ها استفاده شده:
create table #Records ( [Id] int identity not null primary key, [Bedehkar] int not null, [Bestankar] int not null ); go insert into #Records ([Bedehkar],[Bestankar]) values (20000,0), (20000,0), (15000,0), (0,10000) declare @res table ( [id] int not null, [bed] int not null, [bes] int not null, [balance] int not null ); declare @id int, @bed int, @bes int,@sum int = 0; declare bc cursor for select [Id],[Bedehkar],[Bestankar] from #Records order by Id; open bc; fetch next from bc into @id,@bed,@bes while @@FETCH_STATUS = 0 begin set @sum = (@bed + (@bes*-1)) + @sum; insert into @res values (@id,@bed,@bes,@sum); fetch next from bc into @id,@bed,@bes end close bc; deallocate bc; select * from @res
با سلام
خوب شروع می کنیم یه جدول ایجاد می کنیم توی بانک اطلاعاتیمون با مشخصات پایین :
همان طور که گفتید ستون JAM اصلا وجود نداره یعنی ما ایجادش نکردی در مرحله ی طراحی .
اطلاعات زیر و وارد جدول می کنیم همون طور که گفتید :
خوب حالا وقت نوشتن کوئری است :
بخش اول کوئری :
یک متغیر جدول ایجاد میکنیم چرا : چون یک ستون قراره به جدول موقتمون اضافه بشه واین ستون در جدول اصلی ما وجود نداره . دقیقا جدول موقتمون یا متغیر جدولمون رو با تمامی ستون های جدول اصلی + یک ستون بابت JAM ایجاد می کنیم .
در بخش دوم ما با استفاده از دستور Insert تمامی سطرهای جدول اصلی رو وارد جدول موقتمون یا متغیر جدول می کنیم
دقت کنید که این دستور Insert....Select زمانی کارساز خواهد بود و اجازه ی استفاده از اون و داریم که : دقیقا جدول اول و جدول دوم از لحاظ نام ستون ها و تعداد ستون ها یکی باشد پس ما پارامتر آخر در دستور Insert که همان پارامتر آخر دستور Select هست را برای تمامی سطرها 0 قرار داده ایم .
بعدش یک سری متغیر کمکی از نوع int تعریف می کنیم متغیر i برای شمارنده ی حلقه .
متغیر endrow برای تعیین آخرین سطر جدول دقت کنید برای تشخیص آخرین سطر جدول از تابع MAX استفاده کردیم که بزرگترین مقدار اون ستون رو بر می گردونه .
متغیر firstjam هم برای مقدار آخرین ستون یعنی JAM به کارگرفته شده که برای بروز رسانی هر سطر ازش استفاده می کنیم .
خوب بخش دوم کوئری :
خوب بخش دم هم شامل حلقه ی تکرار از سطر شماره ی 1 اولین سطر تا آخرین سط که با تابع MAX بر اساس ID اخرین سطر رو هم مشخص کردیم
خوب داخل حلقه برای اولین سطر یه شرط داریم اونم اینکه چون سطر اول هنوز JAM مقدار اولیه ایی نداره پس کافیه که ستون بدهکار را از بستانکار کم کنیم و در ستون آخر قرار دهیم
خوب اول اینکه توی دستور Select مقدار سطر اول به ازای jam رو حفظ می کنیم در سطرهای بعد بهش نیاز داریم
و دستور آپدیت هم برای اینکه متغیر جدول ما رو ستون آخرش رو بروز کنه
خوب بعد از سطر اول : JAM از سطر اول باید با حاصل تفرق بدهکار و بستانکار جمع بشه که این کار و در دستور Select خارج از IF قرار دادیم یعنی از سطر 1 به بعد
خوب دستور اپدیت هم هر ستون و به ازای شماره ردیف ستون JAM همون سطر رو بروزرسانی می کنه
**** و دقت می کنیم که برای خروج از حلقه باید شمارنده یا همون متغیر i خودمون رو به ازای هر سطر یکی اضافه کنیم
و دستور select آخر هم برای نمایش اطلاعات هست .
اینم نتیجه ی نهایی :
اینم خود کوئری :
Declare @tabletemp table ( id int, Bedehkar int, Bestankar int, jam int null ) Insert into @tabletemp select id,Bedehkar,Bestankar,0 from bedehkar Declare @i int,@endrow int,@firstjam int set @i=1 Select @endrow=Max(id) from @tabletemp while @i<=@endrow begin if @i=1 begin select @firstjam=bedehkar-Bestankar from @tabletemp where id=@i Update @tabletemp set jam=@firstjam where id=1 set @i=@i+1 end select @firstjam=(@firstjam+bedehkar)-Bestankar from @tabletemp where id=@i Update @tabletemp set jam=@firstjam where id = @i set @i=@i+1 end select * from @tabletemp
و اینم کوئری مورد نیاز ساخت جدول بدهکار :
USE [db-itpro] GO /****** Object: Table [dbo].[bedehkar] Script Date: 1396/04/26 12:54:08 ب.ظ ******/ SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO CREATE TABLE [dbo].[bedehkar]( [id] [int] IDENTITY(1,1) NOT NULL, [Bedehkar] [int] NOT NULL, [Bestankar] [int] NOT NULL ) ON [PRIMARY] GO