ali_ahr7
شنبه 01 خرداد 1389, 11:42 صبح
سلام دوستان من مدت ها دنبال راح حل سوال زير بودم و بالاخره تونستم بهترين راه حل اونو پيدا كنم و تصميم گرفتم اونو اينجا بذارم تا همه استفاده كنن.
شرح سوال بصورت زير است:
فرض كنيد بك جدول حاوي كد دانشجو و همچنين درس هاي اخذ شده وي ميباشد.
حال اگز بخواهيم با يك دستور select اطلاعات آنرا بازيابي كنيم بايد از دستور زير استفاده كنيم:
select st_id,dars from tbstudenr
كه نتايج برگردانده شده توسط sql بصورت زير است:
مثال:
1------->فيزيك
2------->رياضي
1-------->ربان
سوال اينجاست كه با چه دستوري نتيجه زير حاصل شود؟
1-------->فيزيك,زبان
2-------->رياضي
راح حل:
ابتدا بايد يك تابع بنويسيم.اين تابع براي پايگاه northwind نوشته شده،در صورت نياز شما آنرا براي خود تعيير دهيد:
CREATE FUNCTION udf_recursive ( @cid INT, @i INT )
RETURNS VARCHAR(8000) AS BEGIN
DECLARE @r VARCHAR(8000), @l VARCHAR(8000)
SELECT @i = @i - 1, @r = ProductName + ', '
FROM Northwind..Products p1
WHERE CategoryId = @cid
AND @i = ( SELECT COUNT(*) FROM Northwind..Products p2
WHERE p2.CategoryId = p1.CategoryId
AND p2.ProductName <= p1.ProductName ) ;
IF @i > 0 BEGIN
EXEC @l = dbo.udf_recursive @cid, @i ;
SET @r = @l + @r ;
END
RETURN @r ;
END
و بعد در برنامه يا كوئري آنالايزر اونو بصورت زير فراخواني ميكنيم.
SELECT CategoryId,
dbo.udf_recursive( CategoryId, COUNT(ProductName) )
FROM Northwind..Products
GROUP BY CategoryId ;
راستي الان وقت ندارم منبعشو بفرستم بعدا معرفي ميكنم.
با تشكر
شرح سوال بصورت زير است:
فرض كنيد بك جدول حاوي كد دانشجو و همچنين درس هاي اخذ شده وي ميباشد.
حال اگز بخواهيم با يك دستور select اطلاعات آنرا بازيابي كنيم بايد از دستور زير استفاده كنيم:
select st_id,dars from tbstudenr
كه نتايج برگردانده شده توسط sql بصورت زير است:
مثال:
1------->فيزيك
2------->رياضي
1-------->ربان
سوال اينجاست كه با چه دستوري نتيجه زير حاصل شود؟
1-------->فيزيك,زبان
2-------->رياضي
راح حل:
ابتدا بايد يك تابع بنويسيم.اين تابع براي پايگاه northwind نوشته شده،در صورت نياز شما آنرا براي خود تعيير دهيد:
CREATE FUNCTION udf_recursive ( @cid INT, @i INT )
RETURNS VARCHAR(8000) AS BEGIN
DECLARE @r VARCHAR(8000), @l VARCHAR(8000)
SELECT @i = @i - 1, @r = ProductName + ', '
FROM Northwind..Products p1
WHERE CategoryId = @cid
AND @i = ( SELECT COUNT(*) FROM Northwind..Products p2
WHERE p2.CategoryId = p1.CategoryId
AND p2.ProductName <= p1.ProductName ) ;
IF @i > 0 BEGIN
EXEC @l = dbo.udf_recursive @cid, @i ;
SET @r = @l + @r ;
END
RETURN @r ;
END
و بعد در برنامه يا كوئري آنالايزر اونو بصورت زير فراخواني ميكنيم.
SELECT CategoryId,
dbo.udf_recursive( CategoryId, COUNT(ProductName) )
FROM Northwind..Products
GROUP BY CategoryId ;
راستي الان وقت ندارم منبعشو بفرستم بعدا معرفي ميكنم.
با تشكر