2011-01-28 17 views
0

学生と複数の教授を想像してください 教授には多くの学生がいます 生徒は同じ時刻と日付でクラスに進みます。私たちは、私はカーソルを研究しています話すとおり、以下の結果SQLを1つに2つ以上並べる

 
ClassName | ProfessorName |StudentsPresent|ClassStartTime |ClassDate |ClassID 
Philosophy | Stewart,Kyle |10    |8:00    |01/29/2011 | 1 
Religion | Myke,Nancy |11    |8:30    |01/29/2011 | 2 

を取得しに行くかどう

表1

 
ClassName | ProfessorName |StudentsPresent|ClassStartTime |ClassDate |ClassID 
Philosophy | Stewart  |10    |8:00    |01/29/2011 | 1 
Philosophy | Kyle   |10    |8:00    |01/29/2011 | 1 
Religion | Myke   |11    |8:30    |01/29/2011 | 2 
Religion | Nancy   |11    |8:30    |01/29/2011 | 2 

+2

関連:http://stackoverflow.com/questions/2046037/sql-server-can-i-comma-delimit-multiple-rows-into-one-column –

+0

が、これは宿題ですか? –

+0

@Abe:私はそれを疑う。これはT-SQLで解決するのは本当に難しい問題です(もちろん、私はこれがSQL Server用だと仮定していると思います)。 OMG Poniesは、これが複製であるというstackoverflowの質問を参照すると、このタイプの結果を得る方法の素晴らしいデモンストレーションがあります。 – richard

答えて

2

あなたのテーブルは非常に非正規化されているようです。私は、カーソルがSQL Server内ではひどいものだと聞いたことがあるので、できる限り避けるべきです。それがどのようにスケジュールと呼ばれるテーブルに置かれているのか、これがあなたの要求を満たす方法です。

DECLARE @Schedule TABLE 
(
    ClassName VARCHAR(50) 
    , ProfessorName VARCHAR(50) 
    , StudentsPresent INT 
    , ClassStartTime TIME 
    , ClassDate DATE 
    , ClassID INT 
); 

INSERT INTO @Schedule 
VALUES ('Philosophy', 'Stewart', 10, '8:00', '20110129', 1) 
    , ('Philosophy', 'Kyle', 10, '8:00', '20110129', 1) 
    , ('Religion', 'Myke', 11, '8:30', '20110129', 2) 
    , ('Religion', 'Nancy', 11, '8:30', '20110129', 2); 

WITH UniqueClasses AS 
(
    SELECT DISTINCT 
     ClassName 
     , ClassStartTime 
     , StudentsPresent 
     , ClassDate 
     , ClassID 
    FROM @Schedule 
) 
SELECT 
    ClassName 
    , (
      STUFF((
        SELECT 
         ',' + ProfessorName 
        FROM @Schedule Schedule 
        WHERE Schedule.ClassID = UniqueClasses.ClassID 
        FOR XML PATH('') 
       ) , 1, 1, '') 
     )AS ProfessorName 
    , StudentsPresent 
    , StudentsPresent 
    , ClassStartTime 
    , ClassDate 
    , ClassID 
FROM UniqueClasses 
+0

テーブルは非常に非正規化データベース[s]から来ています。これは、ストアドプロシージャをレポート(rdl)に実行する前に、そのストアドプロシージャの完成品です。あなたの答えの制限は十分ではありませんが、努力をいただきありがとうございます! – hidden

+0

@ user47533:もっと一般的にすることができますが、もっと情報が必要です。私は始まりと終わりのテーブルしか持っていませんでした。これは2つを変換します。これはあなたが説明する必要がある場合、どのような場合に対処しますか? –

+0

絶対に素晴らしいです。偉大な仕事ジェレミー – hidden

1

これはあなたのために働くかもしれませんが、私はあなたが示した場合だけではないかと思います。

BEGIN 
     DECLARE @c CURSOR 
     DECLARE @PrevProfName VARCHAR(250) , @PrevClassDateID INT 

     DECLARE @NewTable1 TABLE(
      ClassName   VARCHAR(200), 
      ProfessorName  VARCHAR(200), 
      StudentsPresent  INT, 
      ClassStartTime  DATETIME, 
      ClassDateClassID INT) 

     DECLARE 
      @ClassName   VARCHAR(200), 
      @ProfessorName  VARCHAR(200), 
      @StudentsPresent  INT, 
      @ClassStartTime  DATETIME, 
      @ClassDateClassID INT 

     OPEN @c SELECT * FROM @NewTable1 ORDER BY ClassDateClassID 

     FETCH NEXT FROM @c INTO @ClassName, @ProfessorName, @StudentsPresent, @ClassStartTime, @ClassDateClassID 

     WHILE @@FETCH_STATUS = 0 
      BEGIN 
       IF @PrevProfName <> '' AND @PrevClassDateID > 0 
        BEGIN 
         IF @PrevClassDateID = @ClassDateClassID 
          BEGIN 
           SET @PrevProfName = @PrevProfName + ',' + @ProfessorName 
          END 
         ELSE 
          BEGIN 
           INSERT INTO @NewTable1 VALUES(@ClassName, @PrevProfName, @StudentsPresent, @ClassStartTime, @PrevClassDateID) 
           SET @PrevProfName = @ProfessorName 
           SET @PrevClassDateID = @ClassDateClassID 
          END 
        END 
       ELSE 
        BEGIN 
         SET @PrevClassDateID = @ClassDateClassID 
         SET @PrevProfName = @ProfessorName 
        END 

       FETCH NEXT FROM @c INTO @ClassName, @ProfessorName, @StudentsPresent, @ClassStartTime, @ClassDateClassID 
      END 
     CLOSE @c 
     DEALLOCATE @c 

     SELECT * FROM @NewTable1 
    END 
+0

他の方法もありますが、カーソルが必要です。 – AlaaL

+0

他の方法があるかもしれません。 – AlaaL

+0

カーソルは必ずしも必要ではありません。私の答えは、それをすることのない方法の一つです。他の方法も存在します。 ^。^ –

関連する問題