PDA

View Full Version : جمع مقادیر یک ستون



araz_pashazadeh
دوشنبه 21 آذر 1390, 11:05 صبح
با عرض سلام و خسته نباشید خدمت دوستان
من می خواستم با استفاده از پرس وجو مقادیر یک ستون را با هم بصورت زیر جمع کنم:
ستون1 نتیجه
4 4
5 9
3 12
در واقع مقدار ستون جاری را با مقادیر ستون های قبلی جمع می کنم حاصل مقدار سطر جاری میشه.
شبیه همین کار در کریستال انجام دادم ولی نمی دونم چطور میشه پرس و جو معادل را نوشت.
ممنون میشم اگه دوستان من را کمک کنن.

baktash.n81@gmail.com
دوشنبه 21 آذر 1390, 15:30 عصر
سلام

یکی از روشهایی که می تونید این کارو انجام بدید اینه : یک Cursor بنویسید بعد مقدار هر رکورد رو با رکوردهای قبلیش جمع کنید (البته جدول شما باید یک Identity داشته باشد که بتوانید رکوردهای قبلی رو استخراج کنید)

baktash.n81@gmail.com
دوشنبه 21 آذر 1390, 15:34 عصر
البته اگه جئول شما فیلد Identity داشته باشه می تونید از کد زیر هم استفاده کنید


Select b,(selectsum(b)from t2 where a<=s.a)from t2 as s


a : فیلد Identity
b : فیلدی که اعداد در اون ذخیره شده

araz_pashazadeh
دوشنبه 21 آذر 1390, 16:31 عصر
البته اگه جئول شما فیلد Identity داشته باشه می تونید از کد زیر هم استفاده کنید


Select b,(selectsum(b)from t2 where a<=s.a)from t2 as s


a : فیلد Identity
b : فیلدی که اعداد در اون ذخیره شده

دوست عزیز منظور شما را متوجه نشدم.
لطفا کمی بیشتر توضیح بدین اگه مثالی در این مورد باشه ممنون میشم.

baktash.n81@gmail.com
دوشنبه 21 آذر 1390, 17:07 عصر
جدولی دارم به نام T2 که دوتا فیلد داره به اسم A و B ... فیلد A یک فیلد از نوع Identity هست که مقدارش یکی یکی اضافه می شه ... فیلد B اعدادی رو که می خوایم با مقادیر قبلیش جمع بشه

جدول زیر بامقدار های زیر پر شده است

A - B
1-21
2-22
3-32
4-12

حالا Query رو که اجرا کنیم نتیجه به شکل زیر خواهد بود ...

21 21
22 43
32 75
12 87

که هر ستون رو با مقادیر قبلیش جمع می کنه !

tazarvmmr
دوشنبه 21 آذر 1390, 17:54 عصر
سلام

با تعریف یک فانکشن به راحتی میتونی این کارو انجام بدی، البته اصلا به درد جدولهای بزرگ نمیخوره! چون بسیار کنده ولی در مورد جدولهایی که مثلا هزار تا ردیف دارند معقوله:


Create FUNCTION [dbo].[fSum]
(
@Id int
)
RETURNS int
AS
BEGIN
Declare @Sum int
select @Sum = Sum (id)
From Contacts
Where Id <= @Id
Return @Sum
END




اینم میشه سلکتش:

SELECT Id , dbo.fSum(Id) as [Sum]
From Contacts


من اسم جدول رو گذاشتم Contacts و فیلد Id رو برای این کار در نظر گرفتم.

این هم یک راه دیگه:

Select a.Id,(select sum(b.Id)
from Contacts as b
where b.Id <= a.id) as [Sum]
from Contacts as a;

araz_pashazadeh
دوشنبه 21 آذر 1390, 19:00 عصر
جدولی دارم به نام T2 که دوتا فیلد داره به اسم A و B ... فیلد A یک فیلد از نوع Identity هست که مقدارش یکی یکی اضافه می شه ... فیلد B اعدادی رو که می خوایم با مقادیر قبلیش جمع بشه

جدول زیر بامقدار های زیر پر شده است

A - B
1-21
2-22
3-32
4-12

حالا Query رو که اجرا کنیم نتیجه به شکل زیر خواهد بود ...

21 21
22 43
32 75
12 87

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

araz_pashazadeh
دوشنبه 21 آذر 1390, 19:04 عصر
سلام

با تعریف یک فانکشن به راحتی میتونی این کارو انجام بدی، البته اصلا به درد جدولهای بزرگ نمیخوره! چون بسیار کنده ولی در مورد جدولهایی که مثلا هزار تا ردیف دارند معقوله:


Create FUNCTION [dbo].[fSum]
(
@Id int
)
RETURNS int
AS
BEGIN
Declare @Sum int
select @Sum = Sum (id)
From Contacts
Where Id <= @Id
Return @Sum
END




اینم میشه سلکتش:

SELECT Id , dbo.fSum(Id) as [Sum]
From Contacts


من اسم جدول رو گذاشتم Contacts و فیلد Id رو برای این کار در نظر گرفتم.

این هم یک راه دیگه:

Select a.Id,(select sum(b.Id)
from Contacts as b
where b.Id <= a.id) as [Sum]
from Contacts as a;


دوست عزیز این روشی که شما گفتن درست هستش ولی همون طور که شما هم اشاره کردین سرعت اجرا شدنش پایین به همین دلیل از این روش استفاده نمی کنم.
می خوام اینکار را با استفاده از پرس و جو انجام بدم.
از دوستان می خوام من را در این زمینه یاری کنن.

tazarvmmr
دوشنبه 21 آذر 1390, 19:14 عصر
می خوام اینکار را با استفاده از پرس و جو انجام بدم.


ببخشید، من نمیدونم پرس و جو ترجمه چه اصطلاحیه! منظورتون از پرس و جو چیه؟

یوسف زالی
دوشنبه 21 آذر 1390, 19:47 عصر
سلام.
الان اینا همش پرس و جو هست دیگه. (Query)
در حالت کلی با یک مثال نشون می دم:

declare @tbl table(Price decimal)
insert into @tbl
values(500),(700),(200),(100),(400)
;
with CTE as (select ROW_NUMBER()over(order by getdate())as Row, Price from @tbl)
select*,
(select SUM(A.Price)from CTE A where A.Row <= X.Row)as SumTillHere
from CTE X

دیگه از این سریعتر فکر نمی کنم بشه.
البته دوستان هم مورد مشابهی رو ذکر کردند. اما اونجا نیاز به identity هست.

baktash.n81@gmail.com
سه شنبه 22 آذر 1390, 07:36 صبح
دوست عزیز شما رکورد بعدی رو چه جوری می خوای تشخیص بدی ؟! رکورد ها بر چه اساسی مرتب شدند ؟؟ ... رابطه رکورد جاری با رکورد بعدی چیه ؟؟


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

اصلا منطق این کاری که می خوای انجام بدی چیه ؟! جدولت دیگه چه فیلدهایی داره !؟

یوسف زالی
سه شنبه 22 آذر 1390, 08:37 صبح
کی می گه بایدی وجود داره؟
دوست من اگر کد من رو خونده باشید می بینید که بدون کرسر هست.
تو رو خدا ابن قدر دوستان رو به استفاده از این "کرسر" ترغیب نکنید.
در بدترین حالت هم می شه با حلقه این کارو کرد.

tazarvmmr
سه شنبه 22 آذر 1390, 08:49 صبح
می خوام اینکار را با استفاده از پرس و جو انجام بدم.
از دوستان می خوام من را در این زمینه یاری کنن.

من الان متوجه شدم منظور شما از پرس و جو همون کوئریه! خوب با این وصف شما اسم این چیزایی که من نوشتم رو چی میزارین اگه از نظر شما اینا کوئری (پرس و جو) نیستن؟

araz_pashazadeh
سه شنبه 22 آذر 1390, 16:32 عصر
ببخشید، من نمیدونم پرس و جو ترجمه چه اصطلاحیه! منظورتون از پرس و جو چیه؟
منظورم کوری هستش.

araz_pashazadeh
سه شنبه 22 آذر 1390, 16:37 عصر
با تشکر از همه دوستان که من را درا ین زمینه راهنمایی کردن من خودم پرسوجوی به این صورت نوشتم
SELECT Id, Name, Mark,
(SELECT SUM(Mark) AS Mark
FROM Marks AS MarksTemp
WHERE (Marks.Id >= Id)) AS MarkResult
FROM Marks
ORDER BY Id
از نظر من این راه سریعتری هستش.
اگه راه بهتری به نظر دوستان می رسه لطفا بگن؟
چون برای من سرعت اجرا شدن خیلی مهم تعداد فیلدهای من خیلی زیاد هستن.

computer _ student
چهارشنبه 23 آذر 1390, 07:08 صبح
کاربر "you-see"
سلام
Query را که نوشتید متوجه شدم اما 2 تا سوال داشتم
مقابل order by فیلدی را می نویسیم که میخواهیم جدول بر اساس آن مرتب شود، درست است؟ اما شما اینجا از یک تابع استفاده کردید.
تابع get date چه کاری را انجام می دهد؟
CTE نام جدولی است که در نهایت ایجاد می شود؟یا یک نام ثابت است؟
در select های بعدی از جدول CTE استفاده کردید. این جدول که داخل پایگاه ذخیره نمی شود، می شود؟

یوسف زالی
چهارشنبه 23 آذر 1390, 08:14 صبح
سلام.
getdate نام تابعی است که زمان اون لحظه رو در استاندارد SQL می ده.
شما می تونید در Order از تابع هم استفاده کنید. مثلا تابع NewID برای رندوم کردن ترتیب بکار می ره.
CTE نام جدول موقتی هست که با دستور with ساخته می شه و فقط در یک دستور زیری وجود داره و بعد از اون از بین می ره.
در خصوص ذخیره در DB هم نه. ذخیره نمی شه.
به این تکنیک می گن Common Table Expression یا همون CTE.
این تکنیک در نسخه های 2005 به بالا پشتیبانی می شه.
موفق باشید.

HAMRAHSOFT.IR
جمعه 25 آذر 1390, 15:07 عصر
شرمنده من سوالم اینجا پرسیدم چون مشابه این سوال ولی با این فرق که من مخوام یک spبنوسن مشابه فایل اکسسل ضمیمه
مکن راهنمای کنید

یوسف زالی
دوشنبه 03 بهمن 1390, 04:37 صبح
این حل مساله شماست.
می تونید با کمی دستکاری به هدفتون برسید:

declare @t table (id int identity, price decimal, pay decimal)
insert into @t
values(1920000, 300000),(1920000, 200000),(1920000, 40000),(1920000, 450000),(1920000, 940000)
select*, price -(selectSUM(pay)from @t B where B.id <= A.id)as remained
from @t A

HAMRAHSOFT.IR
دوشنبه 03 بهمن 1390, 22:03 عصر
سلام دوست خوب و ممنون از اینک جواب دادید

تیبل من ساختارش این شکلی می باشه

CREATE TABLE [dbo].[Tbl_shhrie](
[shhrieID] [int] IDENTITY(1,1) NOT NULL,
[CustomerID] [int] NULL,
[DriverID] [int] NULL,
[shhriedraft] [nvarchar](50) NULL,
[shhriesrh] [nvarchar](50) NULL,
[sal] [nvarchar](5) NULL
) ON [PRIMARY]

امکان تاردر مورد کد خوتون یک توضیح بهم بدید تا بهتر درک کنم و بتونم تغیرات لازم ایجاد کنم

araz_pashazadeh
یک شنبه 14 اسفند 1390, 12:09 عصر
سلام.
الان اینا همش پرس و جو هست دیگه. (Query)
در حالت کلی با یک مثال نشون می دم:

declare @tbl table(Price decimal)
insert into @tbl
values(500),(700),(200),(100),(400)
;
with CTE as (select ROW_NUMBER()over(order by getdate())as Row, Price from @tbl)
select*,
(select SUM(A.Price)from CTE A where A.Row <= X.Row)as SumTillHere
from CTE X

دیگه از این سریعتر فکر نمی کنم بشه.
البته دوستان هم مورد مشابهی رو ذکر کردند. اما اونجا نیاز به identity هست.

دوست عزیز من فیلد identity دارم ولی اطلاعات به ترتیب نیست چون ممکن کاربر اطلاعات جدید وارد کنه و یا اطلاعات قبلی را پاک کنه به همین خاطر این پرس وجو درست کار نمیکنه (اگه اطلاعات من به تریب پشت سر هم باشه درست کار می کنه).

tiphooo
یک شنبه 14 اسفند 1390, 15:55 عصر
دوست عزیز من فیلد identity دارم ولی اطلاعات به ترتیب نیست چون ممکن کاربر اطلاعات جدید وارد کنه و یا اطلاعات قبلی را پاک کنه به همین خاطر این پرس وجو درست کار نمیکنه (اگه اطلاعات من به تریب پشت سر هم باشه درست کار می کنه).
شما اگر فیلد identity دارید پس مشکلی ندارید identity یکی از کاربردهاش همینه که اگر رکورد جدید وارد شد یا رکوردی حذف شد ترتیب ورود رکوردها به هم نمی خوره در مورد کدی که جناب you-see نوشتند شما در قسمت Order BY نام فیلد Identity رو به جای GetDate() بنویسید
البته اگر از SQLServer 2000 استفاده می کنید ROW_NUMBER اونجا ناشناخته است و نمی توانید استفاده کنید