私は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 ;
次のような結果が得られます
最初の3行を見るだけで、そのmaskid、maskname、schoolid、schoolnameは同じですが、maskdetailは異なるので、最後の列にmaskidなどごとにすべてのmaskdetailsを含めることができる行を1つにしたいです。
私のような出力が欲しい
など。そのためのクエリを作成する際に私を助けてください。
前もって感謝します。
クエリ:
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
追加情報:
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
これは、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 ;
注:完全なテーブル構造がわからないため、関数を変更する必要がある場合があります。
以下のクエリを実行してください。あなたのケースでは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