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

تجميع عدة سجلات من نفس الجدول

بدأه mfarouk في 2 يناير 2014 · 9 رد · 588 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

 

اريد طريقة تجميع عدة سجلات في sql server بحيث يكون الناتج كما في المرفقات

natega.xlsx

#2

السلام عليكم ..

لا أعرف ان كان PIVOT  يمكن أن يحل المشكلة  ...

لكن أنا أقوم بإنشاء ألأعمدة بشكل ديناميكي بالكود  : 

DECLARE @max_course int

SELECT @max_course = ISNull(MAX(TheCount) , 0 ) FROM
	(SELECT COUNT(FULL_NAME_AR) AS TheCount
	FROM STUDENT GROUP BY FULL_NAME_AR) AS Temp
IF OBJECT_ID('tempdb..#temp') IS NOT NULL
   DROP TABLE #temp ;
create table #temp (
	FULL_NAME_AR varchar(50) 
	);
declare @i int
declare @sql nvarchar(MAX)
SET @i = 1;
WHile @i <= @max_course 
BEGIN
	SET @sql = 'ALTER TABLE #temp ADD Course' + CONVERT (nvarchar ,  @i) + N' varchar(50)'
	exec sp_executesql @sql
	SET @sql = 'ALTER TABLE #temp ADD Degree' + CONVERT (nvarchar ,  @i) + N' varchar(50)'
	exec sp_executesql @sql
	SET @sql = 'ALTER TABLE #temp ADD Rank' + CONVERT (nvarchar ,  @i) + N' varchar(50)'
	exec sp_executesql @sql
	SET @i = @i + 1
END --WHILE
declare @FULL_NAME_AR VARCHAR(50)

DECLARE student_cursor CURSOR  FOR SELECT DISTINCT FULL_NAME_AR FROM STUDENT; 
OPEN student_cursor;
FETCH NEXT FROM student_cursor INTO @FULL_NAME_AR;
WHILE @@FETCH_STATUS = 0  
BEGIN  
       
       INSERT INTO #temp (FULL_NAME_AR)VALUES (@FULL_NAME_AR)
       exec dbo.proc_Update	@FULL_NAME_AR ;
 
       FETCH NEXT FROM student_cursor INTO @FULL_NAME_AR;
END;


CLOSE student_cursor;
DEALLOCATE student_cursor;

Select * from #temp;
drop table #temp;

 و لدينا : 

CREATE PROCEDURE [dbo].[proc_Update]
@FULL_NAME_AR	VARCHAR(50)
AS
BEGIN
	declare @SUBJECT_DESCR_AR VARCHAR(50)
	declare @STUD_DEGREE VARCHAR(50)
	declare @SUBJECT_RATING_DESCR_AR VARCHAR(50)
	declare @sql nvarchar(MAX)
	declare @i int
	SET @i = 1
	DECLARE course_cursor CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT SUBJECT_DESCR_AR , STUD_DEGREE , SUBJECT_RATING_DESCR_AR FROM STUDENT WHERE FULL_NAME_AR = @FULL_NAME_AR ORDER BY SUBJECT_DESCR_AR;
	OPEN course_cursor;
	FETCH NEXT FROM course_cursor INTO @SUBJECT_DESCR_AR , @STUD_DEGREE , @SUBJECT_RATING_DESCR_AR ;
	WHILE @@FETCH_STATUS = 0  
	BEGIN  
	   SET @sql = N'UPDATE #temp SET Course' + CONVERT(NVARCHAR , @i) + ' = @Course, Degree' + CONVERT(NVARCHAR , @i) + ' =@Degree , Rank' + CONVERT(NVARCHAR , @i) + ' = @Rank WHERE FULL_NAME_AR = @FName'
	   exec sp_executesql @sql , N'@Course varchar(50) ,@Degree varchar(50), @Rank varchar(50) , @FName Varchar(50)' , 
									@SUBJECT_DESCR_AR ,  @STUD_DEGREE , @SUBJECT_RATING_DESCR_AR  , @FULL_NAME_AR;
	   
	   SET @i = @i + 1;
	   FETCH NEXT FROM course_cursor INTO @SUBJECT_DESCR_AR , @STUD_DEGREE , @SUBJECT_RATING_DESCR_AR ;
	END;
	CLOSE course_cursor;
	DEALLOCATE course_cursor;
END

 ربما ليس حلا مثاليا ...

1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#3

الـــ PIVOT  سيكون كمايلي : 

SELECT FULL_NAME_AR , [مادة1], [مادة2] , [مادة3], [مادة4] , [مادة5], [مادة6]
FROM 
(SELECT FULL_NAME_AR, SUBJECT_DESCR_AR , STUD_DEGREE
FROM STUDENT) p
PIVOT
(
MAX(STUD_DEGREE) FOR SUBJECT_DESCR_AR  IN ([مادة1], [مادة2] , [مادة3], [مادة4] , [مادة5], [مادة6])
) AS pvt
1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#4

اشكرك شكرا جزيلا على اهتمامك

 

وجزاك الله كل خير

#5

اشكرك شكرا جزيلا اخي العزيز مرة اخري 

 

فقد افدتي خير الافادة وجزاك الله عني خيرا كثيرا

 

وكنت اريد من حضرتك اضافة جديدة

 

وهي اذا كان الجدول الاصل يحتوي على عمود اخر مثل NATIONAL_NUMBER

 

فكيف يمكن اضافته لل Pivot table

 

وهل يكون ذلك عن طريق الCREATE PROCEDURE 

ام يكون عن طريق كود Pivot table

 

شكرا لك مرة اخرى واعتذر عن الاطالة

natega.xlsx

#6

السلام عليكم ...

أنا كتبت مشاركتين ... كل منهما فيها اكواد منفصلة عن الأخرى و كل منهما تعمل بطريقة مختلفة ...

انت تريد التعديل في اي منها .؟؟؟؟؟؟؟

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#7

LOOK THIS

SELECT FULL_NAME_AR,NATIONAL_NUMBER , [مادة1], [مادة2] , [مادة3], [مادة4] , [مادة5], [مادة6]
FROM 
(SELECT FULL_NAME_AR, NATIONAL_NUMBER,SUBJECT_DESCR_AR , STUD_DEGREE
FROM STUDENT) p
PIVOT
(
MAX(STUD_DEGREE) FOR SUBJECT_DESCR_AR  IN ([مادة1], [مادة2] , [مادة3], [مادة4] , [مادة5], [مادة6])
) AS pvt
1
#8
حسام الشامي كتب:

السلام عليكم ...

أنا كتبت مشاركتين ... كل منهما فيها اكواد منفصلة عن الأخرى و كل منهما تعمل بطريقة مختلفة ...

انت تريد التعديل في اي منها .؟؟؟؟؟؟؟

 

شكرا لك اخي الكريم على اهتمامك الغالي 

 

اريد التعديل على المشاركة الأولى

#9
mfarouk كتب:

شكرا لك اخي الكريم على اهتمامك الغالي 

 

اريد التعديل على المشاركة الأولى

بارك الله بك أخي ... الأكواد بعد التعديل هي : 

DECLARE @max_course int

SELECT @max_course = ISNull(MAX(TheCount) , 0 ) FROM
	(SELECT COUNT(FULL_NAME_AR) AS TheCount
	FROM STUDENT GROUP BY FULL_NAME_AR) AS Temp
IF OBJECT_ID('tempdb..#temp') IS NOT NULL
   DROP TABLE #temp ;
create table #temp (
	FULL_NAME_AR varchar(50) ,
	NATIONAL_NUMBER varchar(50)
	);
declare @i int
declare @sql nvarchar(MAX)
SET @i = 1;
WHile @i <= @max_course 
BEGIN
	SET @sql = 'ALTER TABLE #temp ADD Course' + CONVERT (nvarchar ,  @i) + N' varchar(50)'
	exec sp_executesql @sql
	SET @sql = 'ALTER TABLE #temp ADD Degree' + CONVERT (nvarchar ,  @i) + N' varchar(50)'
	exec sp_executesql @sql
	SET @sql = 'ALTER TABLE #temp ADD Rank' + CONVERT (nvarchar ,  @i) + N' varchar(50)'
	exec sp_executesql @sql
	SET @i = @i + 1
END --WHILE
declare @FULL_NAME_AR VARCHAR(50)
declare @NATIONAL_NUMBER VARCHAR(50)

DECLARE student_cursor CURSOR  FOR SELECT DISTINCT FULL_NAME_AR , NATIONAL_NUMBER FROM STUDENT; 
OPEN student_cursor;
FETCH NEXT FROM student_cursor INTO @FULL_NAME_AR , @NATIONAL_NUMBER;
WHILE @@FETCH_STATUS = 0  
BEGIN  
       
       INSERT INTO #temp (FULL_NAME_AR , NATIONAL_NUMBER)VALUES (@FULL_NAME_AR , @NATIONAL_NUMBER)
       exec dbo.proc_Update	@NATIONAL_NUMBER ;
 
       FETCH NEXT FROM student_cursor INTO @FULL_NAME_AR , @NATIONAL_NUMBER;
END;


CLOSE student_cursor;
DEALLOCATE student_cursor;

Select * from #temp;
drop table #temp;

 و لدينا : 

ALTER PROCEDURE [dbo].[proc_Update]
@NATIONAL_NUMBER	VARCHAR(50)
AS
BEGIN
	declare @SUBJECT_DESCR_AR VARCHAR(50)
	declare @STUD_DEGREE VARCHAR(50)
	declare @SUBJECT_RATING_DESCR_AR VARCHAR(50)
	declare @sql nvarchar(MAX)
	declare @i int
	SET @i = 1
	DECLARE course_cursor CURSOR LOCAL FAST_FORWARD READ_ONLY FOR SELECT SUBJECT_DESCR_AR , STUD_DEGREE , SUBJECT_RATING_DESCR_AR FROM STUDENT WHERE NATIONAL_NUMBER = @NATIONAL_NUMBER ORDER BY SUBJECT_DESCR_AR;
	OPEN course_cursor;
	FETCH NEXT FROM course_cursor INTO @SUBJECT_DESCR_AR , @STUD_DEGREE , @SUBJECT_RATING_DESCR_AR ;
	WHILE @@FETCH_STATUS = 0  
	BEGIN  
	   SET @sql = N'UPDATE #temp SET Course' + CONVERT(NVARCHAR , @i) + ' = @Course, Degree' + CONVERT(NVARCHAR , @i) + ' =@Degree , Rank' + CONVERT(NVARCHAR , @i) + ' = @Rank WHERE NATIONAL_NUMBER = @NAT_NUMBER'
	   exec sp_executesql @sql , N'@Course varchar(50) ,@Degree varchar(50), @Rank varchar(50) , @NAT_NUMBER Varchar(50)' , 
									@SUBJECT_DESCR_AR ,  @STUD_DEGREE , @SUBJECT_RATING_DESCR_AR  , @NATIONAL_NUMBER;
	   
	   SET @i = @i + 1;
	   FETCH NEXT FROM course_cursor INTO @SUBJECT_DESCR_AR , @STUD_DEGREE , @SUBJECT_RATING_DESCR_AR ;
	END;
	CLOSE course_cursor;
	DEALLOCATE course_cursor;
END
1

لا إله إلا الله ... محمد رسول الله

لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة

المعرًف القديم : houssam11350_11350

من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر

#10

شكرا لكم اخواني حسام وكريم على افادتكم العظيمة لي

 

بارك الله فيكم يا اخواني

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