2013-03-19 2 views
2

Проблема, с которой я сталкиваюсь, вероятно, легко исправить, но я не могу найти ответ в сети из-за специфики проблемы.SQL - объединить два столбца в список, разделенный запятой

В моей базе данных у меня есть 3 таблицы, которые обозначают, как планируется учебный курс. Предположим, что есть курс под названием Working with Excel. Это означает, что таблица Courses имеет ряд для этого.

Вторая таблица обозначает циклы одного и того же курса. Если курс будет дан 1 января 2013 года и 1 февраля 2013 года, в базовых таблицах Cycles вы найдете 2 строки, по одному на каждую дату.

У меня уже есть SQL-скрипт, который дает мне два столбца: название курса и список, разделенный запятой, со всеми датами Cycle.

Пожалуйста, обратите внимание, я использую дд/мм/гггг обозначение

Это, как это в настоящее время создано (небольшой отрывок, это ЗЕЬЕСТ объяснить желаемый результат):

SELECT course.name, 
     stuff((SELECT distinct ',' + CONVERT(varchar(10), cycleDate, 103) --code 101 = mm/dd/yyyy, code 103 = dd/mm/yyyy 
          FROM cycles t2 
          where t2.courseID= course.ID and t2.cycleDate > GETDATE() 
          FOR XML PATH('')),1,1,'') as 'datums' 

выход он дает мне:

NAME     DATUMS 
--------------------------------------------------- 
Working with Excel 01/01/2013,01/02/2013 
Some other course  12/3/2013, 1/4/2013, 1/6/2013 

проблема заключается в том, что мне нужно, чтобы добавить информацию из третьей таблицы я еще не упомянул. Таблица ExtraDays содержит дополнительные дни для цикла, если это занимает больше дня.

Например, если курс «Работа с Excel» занимает 3 дня (1 января + 2 + 3 и 1 февраля + 2 + 3), каждый из циклов курса будет содержать 2 ExtraDays строк, содержащих «дополнительные дни».

таблицы будет выглядеть следующим образом:

Table COURSES 
ID NAME 
--------------------------------------------------- 
1 Working with Excel 

Table CYCLES 
ID DATE   COURSEID 
--------------------------------------------------- 
1 1/1/2013  1 
2 1/2/2013  1 

Table EXTRADAYS 
ID EXTRADATE  CYCLEID 
--------------------------------------------------- 
1 2/1/2013  1 
2 3/1/2013  1 
3 2/2/2013  2 
4 3/2/2013  2  

мне нужно добавить эти ExtraDates в разделенных запятыми список дат в моем выходе. Предпочтительно сортировать, но это необязательно.

Я был в тупике довольно давно. У меня есть некоторый SQL опыт, но, видимо, не достаточно для этой проблемы :)

Я надеюсь, чтобы получить следующий вывод:

NAME     DATUMS 
-------------------------------------------------------------------------------------- 
Working with Excel 01/01/2013,02/01/2013,03/01,2013,01/02/2013,02/02/2013,03/02/2013 

Я хорошо знаю, что структура базы данных может быть улучшена, чтобы упростить это, но, к сожалению, это устаревшее приложение, я не могу изменить структуру.

Может ли кто-нибудь указать мне правильный способ объединения этих двух столбцов.

Надеюсь, я подробно описал свою проблему для вас. Else, просто спросите :)

ответ

2
SELECT course.name, 
     stuff((SELECT distinct ',' + CONVERT(varchar(10), cycleDate, 103) --code 101 = mm/dd/yyyy, code 103 = dd/mm/yyyy 
       FROM (select id, date, courseid from cycles 
        union 
        select id, extradate, courseid from extradays) t2 
       where t2.courseID= course.ID and t2.cycleDate > GETDATE() 
       FOR XML PATH('')),1,1,'') as 'datums' 
+0

extradays не имеет идентификатор курса, только цикл, но я добавил внутреннее соединение к таблице Cycles. Но все остальное было именно тем, что мне нужно, спасибо за ваш быстрый ответ! – Flater

Смежные вопросы