web-dev-qa-db-ja.com

SQL Serverでgroup_concatを使用してクエリを作成する方法

私はSQLサーバーではGroup_concat関数を使用できないことを知っていますが、これは私のクエリをGroup_Concatする必要がある1つの問題です。私はそれがいくつかのロジックを見つけましたが、それを修正することはできません。

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

最初の3行を見るだけで、そのmaskid、maskname、schoolid、schoolnameは同じですが、maskdetailは異なるので、最後の列にmaskidなどごとにすべてのmaskdetailsを含めることができる行を1つにしたいです。

私のような出力が欲しい

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
28
Amit Singh

これは、Scalar-Valued FunctionMSSQL 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 MD.MaskId=@MaskId

    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

以下のクエリを実行してください。あなたのケースでは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