it-swarm.dev

كيفية عمل استعلام مع group_concat في خادم sql

أعلم أنه في خادم sql ، لا يمكننا استخدام دالة Group_concat ، لكن هناك مشكلة واحدة لدي أحتاج فيها إلى Group_Concat طلب بحثي. لقد وجدت google بعض المنطق ولكنني غير قادر على تصحيحه.

select  m.maskid,m.maskname,m.schoolid,s.schoolname,
md.maskdetail
from tblmask m join school s on s.id = m.schoolid 
join maskdetails md on m.maskid = md.maskid
order by m.maskname ;

انه يعطيني نتيجة مثل

enter image description here

مجرد إلقاء نظرة على الصفوف الثلاثة الأولى في هذا maskid ، maskname ، schoolid ، schoolname هو نفسه ولكن maskdetail مختلف لذلك تريد صف واحد لذلك في العمود الأخير الذي يمكن أن يحتوي على جميع تفاصيل maskid حسب maskid وهلم جرا.

أريد بلدي الإخراج مثل

enter image description here

وهلم جرا. لذا ، الرجاء مساعدتي أثناء إجراء استعلام لذلك.

شكرا لك مقدما.

97
Rahul

الاستعلام:

SELECT
      m.maskid
    , m.maskname
    , m.schoolid
    , s.schoolname
    , maskdetail = STUFF((
          SELECT ',' + md.maskdetail
          FROM dbo.maskdetails md
          WHERE m.maskid = md.maskid
          FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
FROM dbo.tblmask m
JOIN dbo.school s ON s.ID = m.schoolid
ORDER BY m.maskname

معلومات إضافية:

تجميع السلسلة في عالم SQL Server

132
Devart
Select
      A.maskid
    , A.maskname
    , A.schoolid
    , B.schoolname
    , STUFF((
          SELECT ',' + T.maskdetail
          FROM dbo.maskdetails T
          WHERE A.maskid = T.maskid
          FOR XML PATH('')), 1, 1, '') as maskdetail 
FROM dbo.tblmask A
JOIN dbo.school B ON B.ID = A.schoolid
Group by  A.maskid
    , A.maskname
    , A.schoolid
    , B.schoolname
27
Amit Singh

يمكن تحقيق ذلك أيضًا باستخدام Scalar-Valued Function في MSSQL 2008
أعلن وظيفتك على النحو التالي ،

CREATE FUNCTION [dbo].[FunctionName]
(@MaskId INT)
RETURNS Varchar(500) 
AS
BEGIN

    DECLARE @SchoolName varchar(500)                        

    SELECT @SchoolName =ISNULL(@SchoolName ,'')+ MD.maskdetail +', ' 
    FROM maskdetails MD WITH (NOLOCK)       
    AND [email protected]

    RETURN @SchoolName

END

وبعد ذلك سيكون الاستعلام النهائي الخاص بك مثل

SELECT m.maskid,m.maskname,m.schoolid,s.schoolname,
(SELECT [dbo].[FunctionName](m.maskid)) 'maskdetail'
FROM tblmask m JOIN school s on s.id = m.schoolid 
ORDER BY m.maskname ;

ملاحظة: قد تضطر إلى تغيير الوظيفة ، لأنني لا أعرف بنية الجدول الكاملة.

7
AbdulRahman Ansari

يرجى تشغيل الاستعلام أدناه ، لا يتطلب STUFF و GROUP BY في حالتك:

Select
      A.maskid
    , A.maskname
    , A.schoolid
    , B.schoolname
    , CAST((
          SELECT  T.maskdetail+','
          FROM dbo.maskdetails T
          WHERE A.maskid = T.maskid
          FOR XML PATH(''))as varchar(max)) as maskdetail 
FROM dbo.tblmask A
JOIN dbo.school B ON B.ID = A.schoolid
5
roopaliv