125

Group_concatSQLサーバーでは関数を使用できないことは知っていますがGroup_Concat、クエリが必要な問題が1つあります.Googleで検索したところ、ロジックが見つかりましたが、修正できません.SQLクエリは

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 ;

次のような結果が得られます

ここに画像の説明を入力

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

次のような出力が必要です

ここに画像の説明を入力

そのためのクエリを作成している間、私を助けてください。

前もって感謝します。

4

4 に答える 4

182

クエリ:

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 の世界における文字列集計

于 2013-07-11T10:56:03.800 に答える
9

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 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 ;

注:完全なテーブル構造がわからないため、関数を変更する必要がある場合があります。

于 2014-07-18T09:55:29.987 に答える