Pertanyaan Cara membuat kueri dengan group_concat di server sql [duplikat]


Pertanyaan ini sudah memiliki jawaban di sini:

Saya tahu bahwa di server sql, kami tidak dapat menggunakannya Group_concat fungsi tetapi di sini adalah satu masalah yang saya miliki di mana saya perlu Group_Concat query saya. Saya google menemukan beberapa logika tetapi tidak dapat memperbaikinya. Kueri sql saya adalah

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 ;

Ini memberi saya hasil seperti

enter image description here

Lihat saja 3 baris pertama Dalam maskid, maskname, schoolid, schoolname sama tetapi maskdetail berbeda jadi ingin satu baris untuk itu di mana kolom terakhir dapat berisi semua maskdetails sesuai maskid dan seterusnya.

Saya ingin hasil saya seperti

enter image description here

Dan begitu seterusnya. Jadi tolong bantu saya saat membuat pertanyaan untuk itu.

Terima kasih sebelumnya.


76
2017-07-11 10:54


asal


Jawaban:


Pertanyaan:

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

Informasi tambahan:

String Aggregation di Dunia SQL Server


105
2017-07-11 10:56



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

20
2017-07-11 11:03



Ini juga dapat dicapai dengan menggunakan Scalar-Valued Function di MSSQL 2008
Deklarasikan fungsi Anda sebagai berikut,

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 MD.MaskId=@MaskId

    RETURN @SchoolName

END

Dan kemudian permintaan terakhir Anda akan seperti

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 ;

catatan: Anda mungkin harus mengubah fungsi, karena saya tidak tahu struktur tabel lengkap.


6
2017-07-18 09:55



Silakan jalankan pertanyaan di bawah ini, itu tidak memerlukan STUFF dan GROUP BY dalam kasus Anda:

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
2017-07-17 10:53