الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

كـيفية طرح قيم من بعضها

بدأه Elayan في 28 نوفمبر 2013 · 17 رد · 2,153 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم 

 

بدي اكتب استعلام بالـ SQL بحيث يطرح قيمه من اخرى .... بحثت كثير 

اليكم مثال : 

اليوم المبيعات الخصم 
10/11/2013 500.45 10.1
11/11/2013 102.01 50.2
12/11/2013 870.98 54.03


الفكرة انه هـاي مبيعات يومية ... و محتاج اني اطرحها لاعرف الفرق ... لكن ما اريده هـو في جملة SQL

#3

ممكن توضح

#4

اشكر لكم متابعتكم .. 

 

المـثال بشكل اوضح : 

Day         Sales

03/12/2013 2150.24

02/12/2013 1730.1

01/12/2013 1530.1    

    المخرجات المطلوبه :   

Day             Sales

03/12/2013 420.14

02/12/2013 200

01/12/2013 1000

 

المقصود يا اخواني اني ابحث عن جملة SQL تقوم بعـرض المبيعات ليـوم معين مطروحه من مبيعات اليوم السابق لها .. 

يعـني مبيعات 03/12/2013 تظهر مطروحه من 02/12/2013 

تم تعديل هذه المشاركة بواسطة Elayan في 3 ديسمبر 2013 في 10:10

#5

السلام عليكم و رحمة الله وبركاته

 

إليك هذه الطريقة على شكل مثال بسيط حضرته لك, و هي لا تعمل إلا مع SQL Server 2012 لأنها تستخدم تقنية الـ SQL Windowing المضافة مؤخراً إلى Sql Server 2012

 
 
Create Table Bill(Id int identity, [Date] DateTime, TotalValue decimal(10,2) )
go
 
-- Insert some data for the test


Insert Bill([Date], TotalValue)
   
Select '01 Jan 2014', 10 union
Select '02 Jan 2014', 25 union
Select '03 Jan 2014', 45 union
Select '04 Jan 2014', 80 union
Select '05 Jan 2014', 97 
go
 
 
-- Now the query comes
Select [Date], TotalValue,
  LAG(TotalValue, 1, 0) over (order by [Date]) as PreviousTotalValue,
  Lead(TotalValue, 1, 0) over (order by [Date]) as NextTotalValue
From Bill

تم تعديل هذه المشاركة بواسطة imadouzoun في 3 ديسمبر 2013 في 11:42

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#7
KARIMSOFT كتب:

 

اخي قرأت المـقال : و استنتجت التـالي و هـي عمليه جمـع ولازم انا اقوم بتحويلها لعملية طرح : 

select a.Id, a.Name, sum(b.Mark) as Mark

from Marks a cross join Marks b

where b.Id <= a.Id

group by a.Id, a.Name

 

لكـن ما هي A و B لأن الجـدول واحد فقط ... 

#8
imadouzoun كتب:

 

السلام عليكم و رحمة الله وبركاته

 

إليك هذه الطريقة على شكل مثال بسيط حضرته لك, و هي لا تعمل إلا مع SQL Server 2012 لأنها تستخدم تقنية الـ SQL Windowing المضافة مؤخراً إلى Sql Server 2012

 
 
Create Table Bill(Id int identity, [Date] DateTime, TotalValue decimal(10,2) )
go
 
-- Insert some data for the test


Insert Bill([Date], TotalValue)
   
Select '01 Jan 2014', 10 union
Select '02 Jan 2014', 25 union
Select '03 Jan 2014', 45 union
Select '04 Jan 2014', 80 union
Select '05 Jan 2014', 97 
go
 
 
-- Now the query comes
Select [Date], TotalValue,
  LAG(TotalValue, 1, 0) over (order by [Date]) as PreviousTotalValue,
  Lead(TotalValue, 1, 0) over (order by [Date]) as NextTotalValue
From Bill

 

أخـي انا بستخدم SQL 2008 للأسف و محتاج الحل فيها, و صعب اغير نظام العمل لأنـه في كثير عمليات بتجري عليه .. لاني في بيئة شركة و ليس منزل 

#9

select a.Id, a.Name, sum(b.Mark) as Mark
from Marks a cross join Marks b
where b.Id <= a.Id
group by a.Id, a.Name

 

اخي جربت الطريقه باكثر من صيغه لكن اكتشفت بانه يقوم باستخدام اليوم من جـدول B اكثر من مره ليطرحه بقيم الايام من جدول A 

 

و هـي جمله الاستعلام عنـدي : 

 

select distinct A.restoid , A.dates,B.dates , (B.dsales - A.dsales) as SALES

from DailySales B cross join  DailySales A
where  A.restoid ='1001'And B.restoid = '1001'
group by A.restoid,B.restoid, A.dates,B.dates ,A.dsales,B.dsales
having MAX(A.dates) < MAX(B.dates) 
Order by A.dates desc
#10

كمان في حل بسيط جداً اذا لم تكن تستخدم الـ SQL Server 2012 .. الحل كالتالي:

 

سأطبق الحل على نفس مثالي السابق (نفس الجدول و نفس البيانات). كل ما عليك فعله هو أن تنشئ Scalar Function تمرر لها بارامتر واحد هو رقم السجل الحالي و تعيد لك قيمة من السجل السابق (المثال بسيط جداً):

 
Create Table Bill(Id int identity, [Date] DateTime, TotalValue decimal(10,2) )
go

-- Insert some data for the test
 
Insert Bill([Date], TotalValue)

Select '01 Jan 2014', 10 union
Select '02 Jan 2014', 25 union
Select '03 Jan 2014', 45 union
Select '04 Jan 2014', 80 union
Select '05 Jan 2014', 97 
go


Create function GetPreviousTotalValue(@Id int)

Returns decimal(10,2)
As
begin
   Return (Select Top 1 TotalValue From Bill Where (Id < @Id) order by date desc)
end

Go

-- The query now will look like

Select *, Previous = dbo.GetPreviousTotalValue(Id) From Bill

تحياتي

تم تعديل هذه المشاركة بواسطة imadouzoun في 4 ديسمبر 2013 في 11:09

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#11

اخي شكراً لمساعدتك المتواصله, حـاولت بالموضوع لكن للأسف بيعطي نفس القيمه لكل الأيـام 

#12

اكتشفت من خلال الكـود اخي عـماد بانه يقـوم بعـرض مبيعات الايام لك ... مشكلتي ليست هنا بحد ذاتها, المشكلة انه المبيعات عم تدخل الى الجـدول بعد القيام بعمليه جمعها مع كل المبيعات السابقه .. يعني حيعرض لك بالجدول انه المبيعات ليومنا هذا بالقيمه X و انا من خلال الكود محتاج اني اجعل قيمه X تطرح من قيمه X في اليوم السابق .. بيطلع معي مبيعات اليوم 

#13

مممممم ... طيب يمكن حل مشكلتك أيضاُ ببساطة و ذلك بتعديل الدالة السابقة لتصبح cumulative على النحو التالي:

 
 
Alter function GetPreviousTotalValue(@Id int)
Returns


decimal(10,2)
As
begin
   Return (Select sum(TotalValue) From Bill Where (Id < @Id))
end
Go

-- The query now will look like

Select *, Previous_Summary = dbo.GetPreviousTotalValue(Id) From Bill

بالتوفيق

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#14

للأسف بيعطيني انه الـ Function بيرجع اكثر من قيمه .. حـولت بالـ Stored Procedure بس مو عارف كيف اخلي جمله الاستعلام تستخدم الـ SP 

#15

جـربت استخدم ستـورد بروسيدجر بس للأسف نفس المشكلة 

#16
Elayan كتب:

للأسف بيعطيني انه الـ Function بيرجع اكثر من قيمه .. حـولت بالـ Stored Procedure بس مو عارف كيف اخلي جمله الاستعلام تستخدم الـ SP 

 

 

لم أفهم ما هي المشكلة بالضبط  :)

Create function GetPreviousTotalValue(@Id int)
Returns


decimal(10,2)
As
begin
   Return (Select sum(TotalValue) From Bill Where (Id < @Id))
end
Go

و هذه طريقة استخدامها 

Select *, Previous_Summary = dbo.GetPreviousTotalValue(Id) From Bill

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#17

في الداله حضرتك كـاتب " sum(TotalValue) " يعـني راح ترجع معـك قيمة, انا المفروض ترجع معي اكثر من قيمه ... قيمة امس و قبل امس و قبل بيومين و بثلاث و هـيك . 

#18

السلام عليكم و رحمة الله..

 

هيك صار بدها كود كتير صراحة .. بس رح قلك شو الفكرة و إنت عليك التنفيذ.. :)

 

- الفكرة أن تجلب التاريخ للـ ID المطلوب ثم تجلب أول تاريخ أدخلته على الجدول ..

- تنشئ بعدها حلقة (Loop) بين أكبر قيمة تاريخ و أصغرها و من أجل كل تاريخ تجلب Sum قيم الفوارتير لما قبله

 

و ستحصل في نهاية المطاف على مصفوفة قيم لكل تاريخ يسبق التاريخ الذي مررته للدالة

 

التاريخ - مجموع القيم لما قبله

 

 

 

و هكذا سيكون الحل ..

 

 

تحياتي

تم تعديل هذه المشاركة بواسطة imadouzoun في 8 ديسمبر 2013 في 10:44

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

مواضيع مشابهة