السلام عليكم
اريد طريقة تجميع عدة سجلات في sql server بحيث يكون الناتج كما في المرفقات
السلام عليكم ..
لا أعرف ان كان 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
ربما ليس حلا مثاليا ...
لا إله إلا الله ... محمد رسول الله
لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة
المعرًف القديم : houssam11350_11350
من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر
الـــ 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
لا إله إلا الله ... محمد رسول الله
لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة
المعرًف القديم : houssam11350_11350
من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر
اشكرك شكرا جزيلا على اهتمامك
وجزاك الله كل خير
اشكرك شكرا جزيلا اخي العزيز مرة اخري
فقد افدتي خير الافادة وجزاك الله عني خيرا كثيرا
وكنت اريد من حضرتك اضافة جديدة
وهي اذا كان الجدول الاصل يحتوي على عمود اخر مثل NATIONAL_NUMBER
فكيف يمكن اضافته لل Pivot table
وهل يكون ذلك عن طريق الCREATE PROCEDURE
ام يكون عن طريق كود Pivot table
شكرا لك مرة اخرى واعتذر عن الاطالة
السلام عليكم ...
أنا كتبت مشاركتين ... كل منهما فيها اكواد منفصلة عن الأخرى و كل منهما تعمل بطريقة مختلفة ...
انت تريد التعديل في اي منها .؟؟؟؟؟؟؟
لا إله إلا الله ... محمد رسول الله
لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة
المعرًف القديم : houssam11350_11350
من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر
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
سبحانه الله وبحمده سبحانه الله العظيم
if (You Love ArabTeam2000 ) MessageBox.Show("All ArabTeam2000 Love You"); else MessageBox.Show("go to your mama"); حسام الشامي كتب:السلام عليكم ...
أنا كتبت مشاركتين ... كل منهما فيها اكواد منفصلة عن الأخرى و كل منهما تعمل بطريقة مختلفة ...
انت تريد التعديل في اي منها .؟؟؟؟؟؟؟
شكرا لك اخي الكريم على اهتمامك الغالي
اريد التعديل على المشاركة الأولى
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
لا إله إلا الله ... محمد رسول الله
لو كانت مشاركتي مفيدة و تريد تشجيعي على المزيد من العطاء , فضلا قم بتقييم المشاركة
المعرًف القديم : houssam11350_11350
من مواضيعي : ArabGenCode : مولد كود و إجراءات مخزنة و واجهات لجداول سيكوال سيرفر
شكرا لكم اخواني حسام وكريم على افادتكم العظيمة لي
بارك الله فيكم يا اخواني