بهار آموزش با تخفیف های شگفت انگیز توسینسو بهار آموزش با تخفیف های شگفت انگیز توسینسو
مانده تا پایان تخفیف
مشاهده دوره ها
0

کوئری ستون مبلغ

با سلام و خسته نباشید

چگونه میتوانیم ستونی تجمیعی (ستون Jam) حاصل از جمع و تفریق رکوردهای سطر جاری بصورت بشکل زیر داشته باشیم. (بدون اینکه ستون Jam در جدول وجود داشته باشد) کوئری مورد نظر را چگونه بنویسیم؟ با تشکر

با سلام و خسته نباشید
چگونه میتوانیم ستونی تجمیعی (ستون Jam) حاصل از جمع و تفریق رکوردهای سطر جاری بصورت بشکل زیر داشته باشیم.  (بدون اینکه ستون Jam در جدول وجود داشته باشد) کوئری مورد نظر را چگونه بنویسیم؟ با تشکر

<center>
||https://tosinso.com/files/get/6bb8094d-fa59-405b-8c36-ed3fbc7a71dc||
<center>

پرسیده شده در 1396/04/26 توسط

2 پاسخ

1

با سلام، برای گرفتن نتیجه مورد نظر می تونید از کوئری زیر الگو بگیرید، کوئری زیر رو به صورت کامل کپی کنید و اجرا کنید خروجی رو دریافت می کنید، چون از 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
پاسخ در 1396/04/26 توسط
0

با سلام

خوب شروع می کنیم یه جدول ایجاد می کنیم توی بانک اطلاعاتیمون با مشخصات پایین :

با سلام
خوب شروع می کنیم یه جدول ایجاد می کنیم توی بانک اطلاعاتیمون با مشخصات پایین :
<center>
||https://dba.tosinso.com/files/get/0ba44c8e-4003-46f7-a4e2-2488802d9013||
<center>
همان طور که گفتید ستون JAM اصلا وجود نداره یعنی ما ایجادش نکردی در مرحله ی طراحی .
اطلاعات زیر و وارد جدول می کنیم همون طور که گفتید :
<center>
||https://dba.tosinso.com/files/get/d377860a-9a23-4d61-b9cb-462e1cc27ee1||
<center>
خوب حالا وقت نوشتن کوئری است :
بخش اول کوئری :
<center>
||https://dba.tosinso.com/files/get/f208dfce-d863-471d-b16c-b3712b49ac18||
<center>
یک متغیر جدول ایجاد میکنیم چرا : چون یک ستون قراره به جدول موقتمون اضافه بشه واین ستون در جدول اصلی ما وجود نداره . دقیقا جدول موقتمون یا متغیر جدولمون رو با تمامی ستون های جدول اصلی + یک ستون بابت JAM ایجاد می کنیم .
در بخش دوم ما با استفاده از دستور Insert تمامی سطرهای جدول اصلی رو وارد جدول موقتمون یا متغیر جدول می کنیم 
دقت کنید که این دستور Insert....Select زمانی کارساز خواهد بود و اجازه ی استفاده از اون و داریم که : دقیقا جدول اول و جدول دوم از لحاظ نام ستون ها و تعداد ستون ها یکی باشد پس ما پارامتر آخر در دستور Insert که همان پارامتر آخر دستور Select هست را برای تمامی سطرها 0 قرار داده ایم .
بعدش یک سری متغیر کمکی از نوع int تعریف می کنیم متغیر i برای شمارنده ی حلقه .
متغیر endrow برای تعیین آخرین سطر جدول دقت کنید برای تشخیص آخرین سطر جدول از تابع MAX استفاده کردیم که بزرگترین مقدار اون ستون رو بر می گردونه .
متغیر firstjam هم برای مقدار آخرین ستون یعنی JAM به کارگرفته شده که برای بروز رسانی هر سطر ازش استفاده می کنیم .
خوب بخش دوم کوئری :
<center>
||https://dba.tosinso.com/files/get/15d3267a-b535-4185-9ac2-1fef1ce80177||
<center>
خوب بخش دم هم شامل حلقه ی تکرار از سطر شماره ی 1 اولین سطر تا آخرین سط که با تابع MAX بر اساس ID اخرین سطر رو هم مشخص کردیم
خوب داخل حلقه برای اولین سطر یه شرط داریم اونم اینکه چون سطر اول هنوز JAM مقدار اولیه ایی نداره پس کافیه که ستون بدهکار را از بستانکار کم کنیم و در ستون آخر قرار دهیم
خوب اول اینکه توی دستور Select مقدار سطر اول به ازای jam  رو حفظ می کنیم در سطرهای بعد بهش نیاز داریم
و دستور آپدیت هم برای اینکه متغیر جدول ما رو ستون آخرش رو بروز کنه
خوب بعد از سطر اول : JAM از سطر اول باید با حاصل تفرق بدهکار و بستانکار جمع بشه که این کار و در دستور Select خارج از IF قرار دادیم یعنی از سطر 1 به بعد
خوب دستور اپدیت هم هر ستون و به ازای شماره ردیف ستون JAM همون سطر رو بروزرسانی می کنه
**** و دقت می کنیم که برای خروج از حلقه باید شمارنده یا همون متغیر i خودمون رو به ازای هر سطر یکی اضافه کنیم
و دستور select آخر هم برای نمایش اطلاعات هست .
اینم نتیجه ی نهایی  :
<center>
||https://dba.tosinso.com/files/get/570128e5-c55c-496a-a1b8-9dea0292a39e||
<center>
اینم خود کوئری :
<center>
<sql>
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
<sql>
<center>
و اینم کوئری مورد نیاز ساخت جدول بدهکار :
<center>
<sql>
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
<sql>
<center>

همان طور که گفتید ستون JAM اصلا وجود نداره یعنی ما ایجادش نکردی در مرحله ی طراحی .

اطلاعات زیر و وارد جدول می کنیم همون طور که گفتید :

با سلام
خوب شروع می کنیم یه جدول ایجاد می کنیم توی بانک اطلاعاتیمون با مشخصات پایین :
<center>
||https://dba.tosinso.com/files/get/0ba44c8e-4003-46f7-a4e2-2488802d9013||
<center>
همان طور که گفتید ستون JAM اصلا وجود نداره یعنی ما ایجادش نکردی در مرحله ی طراحی .
اطلاعات زیر و وارد جدول می کنیم همون طور که گفتید :
<center>
||https://dba.tosinso.com/files/get/d377860a-9a23-4d61-b9cb-462e1cc27ee1||
<center>
خوب حالا وقت نوشتن کوئری است :
بخش اول کوئری :
<center>
||https://dba.tosinso.com/files/get/f208dfce-d863-471d-b16c-b3712b49ac18||
<center>
یک متغیر جدول ایجاد میکنیم چرا : چون یک ستون قراره به جدول موقتمون اضافه بشه واین ستون در جدول اصلی ما وجود نداره . دقیقا جدول موقتمون یا متغیر جدولمون رو با تمامی ستون های جدول اصلی + یک ستون بابت JAM ایجاد می کنیم .
در بخش دوم ما با استفاده از دستور Insert تمامی سطرهای جدول اصلی رو وارد جدول موقتمون یا متغیر جدول می کنیم 
دقت کنید که این دستور Insert....Select زمانی کارساز خواهد بود و اجازه ی استفاده از اون و داریم که : دقیقا جدول اول و جدول دوم از لحاظ نام ستون ها و تعداد ستون ها یکی باشد پس ما پارامتر آخر در دستور Insert که همان پارامتر آخر دستور Select هست را برای تمامی سطرها 0 قرار داده ایم .
بعدش یک سری متغیر کمکی از نوع int تعریف می کنیم متغیر i برای شمارنده ی حلقه .
متغیر endrow برای تعیین آخرین سطر جدول دقت کنید برای تشخیص آخرین سطر جدول از تابع MAX استفاده کردیم که بزرگترین مقدار اون ستون رو بر می گردونه .
متغیر firstjam هم برای مقدار آخرین ستون یعنی JAM به کارگرفته شده که برای بروز رسانی هر سطر ازش استفاده می کنیم .
خوب بخش دوم کوئری :
<center>
||https://dba.tosinso.com/files/get/15d3267a-b535-4185-9ac2-1fef1ce80177||
<center>
خوب بخش دم هم شامل حلقه ی تکرار از سطر شماره ی 1 اولین سطر تا آخرین سط که با تابع MAX بر اساس ID اخرین سطر رو هم مشخص کردیم
خوب داخل حلقه برای اولین سطر یه شرط داریم اونم اینکه چون سطر اول هنوز JAM مقدار اولیه ایی نداره پس کافیه که ستون بدهکار را از بستانکار کم کنیم و در ستون آخر قرار دهیم
خوب اول اینکه توی دستور Select مقدار سطر اول به ازای jam  رو حفظ می کنیم در سطرهای بعد بهش نیاز داریم
و دستور آپدیت هم برای اینکه متغیر جدول ما رو ستون آخرش رو بروز کنه
خوب بعد از سطر اول : JAM از سطر اول باید با حاصل تفرق بدهکار و بستانکار جمع بشه که این کار و در دستور Select خارج از IF قرار دادیم یعنی از سطر 1 به بعد
خوب دستور اپدیت هم هر ستون و به ازای شماره ردیف ستون JAM همون سطر رو بروزرسانی می کنه
**** و دقت می کنیم که برای خروج از حلقه باید شمارنده یا همون متغیر i خودمون رو به ازای هر سطر یکی اضافه کنیم
و دستور select آخر هم برای نمایش اطلاعات هست .
اینم نتیجه ی نهایی  :
<center>
||https://dba.tosinso.com/files/get/570128e5-c55c-496a-a1b8-9dea0292a39e||
<center>
اینم خود کوئری :
<center>
<sql>
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
<sql>
<center>
و اینم کوئری مورد نیاز ساخت جدول بدهکار :
<center>
<sql>
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
<sql>
<center>

خوب حالا وقت نوشتن کوئری است :

بخش اول کوئری :

با سلام
خوب شروع می کنیم یه جدول ایجاد می کنیم توی بانک اطلاعاتیمون با مشخصات پایین :
<center>
||https://dba.tosinso.com/files/get/0ba44c8e-4003-46f7-a4e2-2488802d9013||
<center>
همان طور که گفتید ستون JAM اصلا وجود نداره یعنی ما ایجادش نکردی در مرحله ی طراحی .
اطلاعات زیر و وارد جدول می کنیم همون طور که گفتید :
<center>
||https://dba.tosinso.com/files/get/d377860a-9a23-4d61-b9cb-462e1cc27ee1||
<center>
خوب حالا وقت نوشتن کوئری است :
بخش اول کوئری :
<center>
||https://dba.tosinso.com/files/get/f208dfce-d863-471d-b16c-b3712b49ac18||
<center>
یک متغیر جدول ایجاد میکنیم چرا : چون یک ستون قراره به جدول موقتمون اضافه بشه واین ستون در جدول اصلی ما وجود نداره . دقیقا جدول موقتمون یا متغیر جدولمون رو با تمامی ستون های جدول اصلی + یک ستون بابت JAM ایجاد می کنیم .
در بخش دوم ما با استفاده از دستور Insert تمامی سطرهای جدول اصلی رو وارد جدول موقتمون یا متغیر جدول می کنیم 
دقت کنید که این دستور Insert....Select زمانی کارساز خواهد بود و اجازه ی استفاده از اون و داریم که : دقیقا جدول اول و جدول دوم از لحاظ نام ستون ها و تعداد ستون ها یکی باشد پس ما پارامتر آخر در دستور Insert که همان پارامتر آخر دستور Select هست را برای تمامی سطرها 0 قرار داده ایم .
بعدش یک سری متغیر کمکی از نوع int تعریف می کنیم متغیر i برای شمارنده ی حلقه .
متغیر endrow برای تعیین آخرین سطر جدول دقت کنید برای تشخیص آخرین سطر جدول از تابع MAX استفاده کردیم که بزرگترین مقدار اون ستون رو بر می گردونه .
متغیر firstjam هم برای مقدار آخرین ستون یعنی JAM به کارگرفته شده که برای بروز رسانی هر سطر ازش استفاده می کنیم .
خوب بخش دوم کوئری :
<center>
||https://dba.tosinso.com/files/get/15d3267a-b535-4185-9ac2-1fef1ce80177||
<center>
خوب بخش دم هم شامل حلقه ی تکرار از سطر شماره ی 1 اولین سطر تا آخرین سط که با تابع MAX بر اساس ID اخرین سطر رو هم مشخص کردیم
خوب داخل حلقه برای اولین سطر یه شرط داریم اونم اینکه چون سطر اول هنوز JAM مقدار اولیه ایی نداره پس کافیه که ستون بدهکار را از بستانکار کم کنیم و در ستون آخر قرار دهیم
خوب اول اینکه توی دستور Select مقدار سطر اول به ازای jam  رو حفظ می کنیم در سطرهای بعد بهش نیاز داریم
و دستور آپدیت هم برای اینکه متغیر جدول ما رو ستون آخرش رو بروز کنه
خوب بعد از سطر اول : JAM از سطر اول باید با حاصل تفرق بدهکار و بستانکار جمع بشه که این کار و در دستور Select خارج از IF قرار دادیم یعنی از سطر 1 به بعد
خوب دستور اپدیت هم هر ستون و به ازای شماره ردیف ستون JAM همون سطر رو بروزرسانی می کنه
**** و دقت می کنیم که برای خروج از حلقه باید شمارنده یا همون متغیر i خودمون رو به ازای هر سطر یکی اضافه کنیم
و دستور select آخر هم برای نمایش اطلاعات هست .
اینم نتیجه ی نهایی  :
<center>
||https://dba.tosinso.com/files/get/570128e5-c55c-496a-a1b8-9dea0292a39e||
<center>
اینم خود کوئری :
<center>
<sql>
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
<sql>
<center>
و اینم کوئری مورد نیاز ساخت جدول بدهکار :
<center>
<sql>
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
<sql>
<center>

یک متغیر جدول ایجاد میکنیم چرا : چون یک ستون قراره به جدول موقتمون اضافه بشه واین ستون در جدول اصلی ما وجود نداره . دقیقا جدول موقتمون یا متغیر جدولمون رو با تمامی ستون های جدول اصلی + یک ستون بابت JAM ایجاد می کنیم .

در بخش دوم ما با استفاده از دستور Insert تمامی سطرهای جدول اصلی رو وارد جدول موقتمون یا متغیر جدول می کنیم

دقت کنید که این دستور Insert....Select زمانی کارساز خواهد بود و اجازه ی استفاده از اون و داریم که : دقیقا جدول اول و جدول دوم از لحاظ نام ستون ها و تعداد ستون ها یکی باشد پس ما پارامتر آخر در دستور Insert که همان پارامتر آخر دستور Select هست را برای تمامی سطرها 0 قرار داده ایم .

بعدش یک سری متغیر کمکی از نوع int تعریف می کنیم متغیر i برای شمارنده ی حلقه .

متغیر endrow برای تعیین آخرین سطر جدول دقت کنید برای تشخیص آخرین سطر جدول از تابع MAX استفاده کردیم که بزرگترین مقدار اون ستون رو بر می گردونه .

متغیر firstjam هم برای مقدار آخرین ستون یعنی JAM به کارگرفته شده که برای بروز رسانی هر سطر ازش استفاده می کنیم .

خوب بخش دوم کوئری :

با سلام
خوب شروع می کنیم یه جدول ایجاد می کنیم توی بانک اطلاعاتیمون با مشخصات پایین :
<center>
||https://dba.tosinso.com/files/get/0ba44c8e-4003-46f7-a4e2-2488802d9013||
<center>
همان طور که گفتید ستون JAM اصلا وجود نداره یعنی ما ایجادش نکردی در مرحله ی طراحی .
اطلاعات زیر و وارد جدول می کنیم همون طور که گفتید :
<center>
||https://dba.tosinso.com/files/get/d377860a-9a23-4d61-b9cb-462e1cc27ee1||
<center>
خوب حالا وقت نوشتن کوئری است :
بخش اول کوئری :
<center>
||https://dba.tosinso.com/files/get/f208dfce-d863-471d-b16c-b3712b49ac18||
<center>
یک متغیر جدول ایجاد میکنیم چرا : چون یک ستون قراره به جدول موقتمون اضافه بشه واین ستون در جدول اصلی ما وجود نداره . دقیقا جدول موقتمون یا متغیر جدولمون رو با تمامی ستون های جدول اصلی + یک ستون بابت JAM ایجاد می کنیم .
در بخش دوم ما با استفاده از دستور Insert تمامی سطرهای جدول اصلی رو وارد جدول موقتمون یا متغیر جدول می کنیم 
دقت کنید که این دستور Insert....Select زمانی کارساز خواهد بود و اجازه ی استفاده از اون و داریم که : دقیقا جدول اول و جدول دوم از لحاظ نام ستون ها و تعداد ستون ها یکی باشد پس ما پارامتر آخر در دستور Insert که همان پارامتر آخر دستور Select هست را برای تمامی سطرها 0 قرار داده ایم .
بعدش یک سری متغیر کمکی از نوع int تعریف می کنیم متغیر i برای شمارنده ی حلقه .
متغیر endrow برای تعیین آخرین سطر جدول دقت کنید برای تشخیص آخرین سطر جدول از تابع MAX استفاده کردیم که بزرگترین مقدار اون ستون رو بر می گردونه .
متغیر firstjam هم برای مقدار آخرین ستون یعنی JAM به کارگرفته شده که برای بروز رسانی هر سطر ازش استفاده می کنیم .
خوب بخش دوم کوئری :
<center>
||https://dba.tosinso.com/files/get/15d3267a-b535-4185-9ac2-1fef1ce80177||
<center>
خوب بخش دم هم شامل حلقه ی تکرار از سطر شماره ی 1 اولین سطر تا آخرین سط که با تابع MAX بر اساس ID اخرین سطر رو هم مشخص کردیم
خوب داخل حلقه برای اولین سطر یه شرط داریم اونم اینکه چون سطر اول هنوز JAM مقدار اولیه ایی نداره پس کافیه که ستون بدهکار را از بستانکار کم کنیم و در ستون آخر قرار دهیم
خوب اول اینکه توی دستور Select مقدار سطر اول به ازای jam  رو حفظ می کنیم در سطرهای بعد بهش نیاز داریم
و دستور آپدیت هم برای اینکه متغیر جدول ما رو ستون آخرش رو بروز کنه
خوب بعد از سطر اول : JAM از سطر اول باید با حاصل تفرق بدهکار و بستانکار جمع بشه که این کار و در دستور Select خارج از IF قرار دادیم یعنی از سطر 1 به بعد
خوب دستور اپدیت هم هر ستون و به ازای شماره ردیف ستون JAM همون سطر رو بروزرسانی می کنه
**** و دقت می کنیم که برای خروج از حلقه باید شمارنده یا همون متغیر i خودمون رو به ازای هر سطر یکی اضافه کنیم
و دستور select آخر هم برای نمایش اطلاعات هست .
اینم نتیجه ی نهایی  :
<center>
||https://dba.tosinso.com/files/get/570128e5-c55c-496a-a1b8-9dea0292a39e||
<center>
اینم خود کوئری :
<center>
<sql>
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
<sql>
<center>
و اینم کوئری مورد نیاز ساخت جدول بدهکار :
<center>
<sql>
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
<sql>
<center>

خوب بخش دم هم شامل حلقه ی تکرار از سطر شماره ی 1 اولین سطر تا آخرین سط که با تابع MAX بر اساس ID اخرین سطر رو هم مشخص کردیم

خوب داخل حلقه برای اولین سطر یه شرط داریم اونم اینکه چون سطر اول هنوز JAM مقدار اولیه ایی نداره پس کافیه که ستون بدهکار را از بستانکار کم کنیم و در ستون آخر قرار دهیم

خوب اول اینکه توی دستور Select مقدار سطر اول به ازای jam رو حفظ می کنیم در سطرهای بعد بهش نیاز داریم

و دستور آپدیت هم برای اینکه متغیر جدول ما رو ستون آخرش رو بروز کنه

خوب بعد از سطر اول : JAM از سطر اول باید با حاصل تفرق بدهکار و بستانکار جمع بشه که این کار و در دستور Select خارج از IF قرار دادیم یعنی از سطر 1 به بعد

خوب دستور اپدیت هم هر ستون و به ازای شماره ردیف ستون JAM همون سطر رو بروزرسانی می کنه

**** و دقت می کنیم که برای خروج از حلقه باید شمارنده یا همون متغیر i خودمون رو به ازای هر سطر یکی اضافه کنیم

و دستور select آخر هم برای نمایش اطلاعات هست .

اینم نتیجه ی نهایی :

با سلام
خوب شروع می کنیم یه جدول ایجاد می کنیم توی بانک اطلاعاتیمون با مشخصات پایین :
<center>
||https://dba.tosinso.com/files/get/0ba44c8e-4003-46f7-a4e2-2488802d9013||
<center>
همان طور که گفتید ستون JAM اصلا وجود نداره یعنی ما ایجادش نکردی در مرحله ی طراحی .
اطلاعات زیر و وارد جدول می کنیم همون طور که گفتید :
<center>
||https://dba.tosinso.com/files/get/d377860a-9a23-4d61-b9cb-462e1cc27ee1||
<center>
خوب حالا وقت نوشتن کوئری است :
بخش اول کوئری :
<center>
||https://dba.tosinso.com/files/get/f208dfce-d863-471d-b16c-b3712b49ac18||
<center>
یک متغیر جدول ایجاد میکنیم چرا : چون یک ستون قراره به جدول موقتمون اضافه بشه واین ستون در جدول اصلی ما وجود نداره . دقیقا جدول موقتمون یا متغیر جدولمون رو با تمامی ستون های جدول اصلی + یک ستون بابت JAM ایجاد می کنیم .
در بخش دوم ما با استفاده از دستور Insert تمامی سطرهای جدول اصلی رو وارد جدول موقتمون یا متغیر جدول می کنیم 
دقت کنید که این دستور Insert....Select زمانی کارساز خواهد بود و اجازه ی استفاده از اون و داریم که : دقیقا جدول اول و جدول دوم از لحاظ نام ستون ها و تعداد ستون ها یکی باشد پس ما پارامتر آخر در دستور Insert که همان پارامتر آخر دستور Select هست را برای تمامی سطرها 0 قرار داده ایم .
بعدش یک سری متغیر کمکی از نوع int تعریف می کنیم متغیر i برای شمارنده ی حلقه .
متغیر endrow برای تعیین آخرین سطر جدول دقت کنید برای تشخیص آخرین سطر جدول از تابع MAX استفاده کردیم که بزرگترین مقدار اون ستون رو بر می گردونه .
متغیر firstjam هم برای مقدار آخرین ستون یعنی JAM به کارگرفته شده که برای بروز رسانی هر سطر ازش استفاده می کنیم .
خوب بخش دوم کوئری :
<center>
||https://dba.tosinso.com/files/get/15d3267a-b535-4185-9ac2-1fef1ce80177||
<center>
خوب بخش دم هم شامل حلقه ی تکرار از سطر شماره ی 1 اولین سطر تا آخرین سط که با تابع MAX بر اساس ID اخرین سطر رو هم مشخص کردیم
خوب داخل حلقه برای اولین سطر یه شرط داریم اونم اینکه چون سطر اول هنوز JAM مقدار اولیه ایی نداره پس کافیه که ستون بدهکار را از بستانکار کم کنیم و در ستون آخر قرار دهیم
خوب اول اینکه توی دستور Select مقدار سطر اول به ازای jam  رو حفظ می کنیم در سطرهای بعد بهش نیاز داریم
و دستور آپدیت هم برای اینکه متغیر جدول ما رو ستون آخرش رو بروز کنه
خوب بعد از سطر اول : JAM از سطر اول باید با حاصل تفرق بدهکار و بستانکار جمع بشه که این کار و در دستور Select خارج از IF قرار دادیم یعنی از سطر 1 به بعد
خوب دستور اپدیت هم هر ستون و به ازای شماره ردیف ستون JAM همون سطر رو بروزرسانی می کنه
**** و دقت می کنیم که برای خروج از حلقه باید شمارنده یا همون متغیر i خودمون رو به ازای هر سطر یکی اضافه کنیم
و دستور select آخر هم برای نمایش اطلاعات هست .
اینم نتیجه ی نهایی  :
<center>
||https://dba.tosinso.com/files/get/570128e5-c55c-496a-a1b8-9dea0292a39e||
<center>
اینم خود کوئری :
<center>
<sql>
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
<sql>
<center>
و اینم کوئری مورد نیاز ساخت جدول بدهکار :
<center>
<sql>
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
<sql>
<center>

اینم خود کوئری :

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
پاسخ در 1396/04/26 توسط

پاسخ شما