0

次の結果を生成するクエリがあります

NAME         WeekPattern

John Smith   
John Smith   //
John Smith   OO
Jack Jones   
Jack Jones   O
Jack Jones   //

結果が次のように表示されるように、WeekPattern 列を連結する方法はありますか。

NAME         WeekPattern

John Smith     // OO
Jack Jones     O //

FOR XML PATH を使用してみましたが、機能しませんでした。これが私の試みのクエリです。

SELECT 
p.p_surname,
p.p_forenames,
LEFT(sr.sr_weekpattern , LEN(sr.sr_weekpattern )-1) AS Weekpattern
FROM 
unitesnapshot.dbo.capd_studentregister sr
INNER JOIN unitesnapshot.dbo.capd_person p ON p.p_id = sr.sr_student
CROSS APPLY
(
    SELECT sr.sr_weekpattern + ' '
    FROM unitesnapshot.dbo.capd_studentregister sr1
    INNER JOIN unitesnapshot.dbo.capd_person p1 ON p1.p_id = sr1.sr_student

    WHERE p.p_id = p1.p_id
    FOR XML PATH('')
) pre_trimmed (Weekpattern)
GROUP BY p.p_surname, p.p_forenames, sr.sr_weekpattern;

このクエリを実行すると、次のエラーが発生します。

LEFT または SUBSTRING 関数に無効な長さパラメーターが渡されました。

どんな助けでも大歓迎です

4

2 に答える 2

2
SELECT
     Name,
     STUFF(
         (SELECT ' ' + WeekPattern
          FROM TableName
          WHERE NAME = a.NAME AND WeekPattern IS NOT NULL
          FOR XML PATH (''))
          , 1, 1, '')  AS WeekPatternList
FROM TableName AS a
GROUP BY Name
于 2013-02-28T15:22:29.683 に答える
1

既存のクエリに基づいて、の正しい列を参照していないためLEFT、次を使用する必要があります。

SELECT 
  p.p_surname,
  p.p_forenames,
  LEFT(pre_trimmed.Weekpattern , LEN(pre_trimmed.Weekpattern)-1) AS Weekpattern
FROM unitesnapshot.dbo.capd_studentregister sr
INNER JOIN unitesnapshot.dbo.capd_person p 
  ON p.p_id = sr.sr_student
CROSS APPLY
(
  SELECT sr1.sr_weekpattern + ' '
  FROM unitesnapshot.dbo.capd_studentregister sr1
  INNER JOIN unitesnapshot.dbo.capd_person p1 
    ON p1.p_id = sr1.sr_student
  WHERE p.p_id = p1.p_id
  FOR XML PATH('')
) pre_trimmed (Weekpattern)
于 2013-02-28T15:26:35.863 に答える