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

استعلام يقوم بقلب الصفوف أعمدة

مغلق
بدأه Ammar Gaffar في 3 يوليو 2005 · 4 رد · 2,749 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

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

الاخوة الأعزاء ,, عندي تقرير معقد بعض الشئ ويتطلب في عرضه أن أقوم بقلب الصفوف (لبعض محتويات التقرير) الي أعمدة وعرضها كأعمدة في ورقة التقرير , ماهي الشفرة بال TSQL اللازمة ؟... رأيت نفس هذه العملية بالأكسس باستخدام جملة Transform ؟؟

والله الموفق..

#2
اقتباس
عندي تقرير معقد بعض الشئ ويتطلب في عرضه أن أقوم بقلب الصفوف (لبعض محتويات التقرير) الي أعمدة وعرضها كأعمدة في ورقة التقرير , ماهي الشفرة بال TSQL اللازمة ؟... رأيت نفس هذه العملية بالأكسس باستخدام جملة Transform

الأخ عمار

لم تقابلني دالة Pivotting ، وهي العملية التي سألت عنها، في TSQL ، وتوجد مثل هذه الدالة في SQL Server Analysis Service واللغة الخاصة به المسماة MDX فقط لغرض تحليل البيانات ليس إلا.

ولكن ببحث صغير في Books Online وجدت هذه الطريقة التي تستطيع محاكاتها:

بفرض أن لدينا سجل واحد مقابل كل ربع سنة، مثلا:

Year   Quarter  Amount
2001      1         285
2001      2         546
2001      3         544
...............

ونريد تحويل الناتج ليكون هكذا:

Year    Q1   Q1   Q3    Q4
2001    285  546  544 ....
.....

سنقوم بإنشاء جدول مؤقت (أوجدول مخصص للتحويل) نقوم بملئه من الجدول الأول، وسنسمي هذا الجدول Pivot:

create table pivot(
yeear smallint,
quaarter tinyint,
amount smallmoney
)
go

مثال لملئه:

insert into pivot values(2001, 1, 285)
insert into pivot values(2001, 2, 546)
insert into pivot values(2001, 3, 544)
insert into pivot values(2001, 4, 385)
go

من المعروف أننا سنسترجع البيانات وفق نظام سجل لكل ربع سنة بالاستعلام التالي بكل بساطة:

select yeear, quaarter, amount from pivot go

ولكننا نريد استرجاع المبالغ لكل ربع في كل سنة، أي سجل لكل سنة وتكون الأرباع أعمدة، بينما كانت في الاستعلام السابق صفوفا

جملة SQL التالية تسترجع البيانات

select yeear, 
sum(case quaarter when 1 then amount else 0 end) as q1, 
sum(case quaarter when 2 then amount else 0 end) as q2,
sum(case quaarter when 3 then amount else 0 end) as q3,
sum(case quaarter when 4 then amount else 0 end) as q4
from pivot group by yeear
go

هذه الجملة تعالج أيضا حالة وجود أكثر من سجل لكل ربع سنة، وذلك بتجميعها بالسنة عبر فقرة group by، وعند التجميع grouping، تقوم فقرة case الموجودة داخل الدالة التجميعية sum بتجميع المبلغ لكل ربع محدد ووضعها في العمود المناسب في الناتج، وتجميع القيمة الصفرية لأي ربع غير الربع المحدد.

كما رأيت :)، الشفرة تعتمد على بنية الجدول الذي تريد منه الاستعلام بالصورة التي سألت عنها.

فلو قمت بإعطائنا بنية الجدول وشكل التقرير الذي تريده لأمكننا التفاعل معك أكثر إن شاء الله.

بالتوفيق بإذن الله :)

تم تعديل هذه المشاركة بواسطة walcom في 3 يوليو 2005 في 19:37

فكر بطريقة أخرى

#3

الاخ العزيز وليد لك جزيل الشكر والتقدير علي مشاركتك القيمة .... :)

لقد حللت المشكلة من داخل الكريستال ريبورت باستخدام الـ Cross Tab .. وبصراحة مشاركتك قد حلت لي مسألة أخري . :)

والله الموفق

#4
اقتباس
لقد حللت المشكلة من داخل الكريستال ريبورت باستخدام الـ Cross Tab .. وبصراحة مشاركتك قد حلت لي مسألة أخري .

ممكن تفيدنا بيها معاك :) :rolleyes:

--------------------------------

نسيت أن أقول أن الPivotting بصورة مباشرة، وليس بطريقة تحايل مثل الطريقة التي ذكرتها أعلاه، سيكون أحد المزايا الجديدة في SQL Server 2005.

تم تعديل هذه المشاركة بواسطة walcom في 4 يوليو 2005 في 09:48

1

فكر بطريقة أخرى

#5

الأخ العزيز وليد

أقوم بتطوير نظام PayRoll وعندي تقرير يقوم بعرض أكثر من محتويات جدول وكانت المشكلة هي أنني يجب أن أقوم بعرض محتويات جدول كعمود في التقرير والكريستال لايقوم بهذه العملية في الوضع الطبيعي وكان أماي حلين , إما أن اقوم بمعالجة المشكلة علي مستوي قاعدة البيانات وذلك بإيجاد جملة SQL تقوم بالمهمة أو علي مستوي التقرير (وكالعادة بحثت في الخيار الأسهل وهي علي مستوي التقرير :D ) فوجدت ال Cross Tab والتي حلت لي جزء كبير من المشكلة

والجداول التي أفوم بعرضها في التقرير هي ثلاثة جداول

جدول الـ Types وهو الذي أحتاج فيه لعرض محتوياته من الصفوف كأعمدة والمحتوي الذي أقوم بعرضه هو TypeName

جدول الـ Main Transactions والذي أقوم فيه بعرض قيم الـ Types بالنسبة للموظفين

جدول الـ Employees والذي أستخدمه لعرض بعض من معلومات الموظف الرئيسية

وواجهتني بعض المتاعب مع الـ Cross Tab (لانني لم أستخدمها من قبل) في أنني أحتاج لبعض التعليمات لحساب قيمة حقل معين فالـ Cross tab تقوم بعمل Sum للـ Total ..

هل هنالك طريقة يمكنني من خلالها أن أقوم بالتحكم في المحتويات الداخلية للـ Cross Tab كإضافة Formula تقوم بعمل محدد ؟؟

والشكر الجزيل لمنتدي الـ SQL Server

والله الموفق

هذا الموضوع مغلق.

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