2011-01-28 7 views
0

학생 및 다수의 교수를 상상해보십시오 교수는 많은 학생이 있습니다 학생들은 같은 시간과 날짜에 수업에갑니다.SQL 두 개 이상의 행 하나씩

표는

 
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 

어떻게 우리가 내가 커서를 연구하고 말하는으로 다음과 같은 결과

 
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 

을 얻기에 관하여 갈 것입니다.

+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 내에서 끔찍한 일이라고 들었습니다. 가능한 경우이를 피해야합니다. 어떻게 그것이 Schedule이라는 테이블에 넣어 지는지, 이것이 내가 당신의 요구를 이행 할 수있는 방법입니다.

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

테이블은 고도로 비정규 화 된 데이터베이스에서 가져온 것입니다. 이것은 보고서 (rdl)로 실행되기 전에 저장 프로 시저의 완제품입니다. 귀하의 답변 한도는 일반적이지 않지만 노력에 감사드립니다! – hidden

+0

@ user47533 : 좀 더 일반적으로 만들 수 있지만 더 많은 정보가 필요합니다. 나는 시작과 끝 테이블 만 가지고 있으며, 이것은 두 개를 변환합니다. 이 문제를 처리하지 못하는 경우가 있습니다. –

+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

커서가 반드시 필요한 것은 아닙니다. 그것없이 할 수있는 한 가지 방법에 대한 내 대답을 참조하십시오. 다른 방법도 존재합니다. ^.^ –

관련 문제