SQL - 将两列组合成逗号分隔列表

时间:2013-03-19 10:47:38

标签: sql sql-server-2008

我面临的问题可能很容易解决,但由于问题的特殊性,我似乎无法在网上找到答案。

在我的数据库中,我有3个表来表示如何计划教育课程。假设有一个名为Working with Excel的课程。这意味着表Courses有一行。

第二个表格表示相同课程的周期。如果课程在2013年1月1日和2013年2月1日给出,则在基础表Cycles中,您将找到2行,每个日期对应一行。

我目前已经有一个SQL脚本,它为我提供了两列:课程名称和包含所有Cycle日期的逗号分隔列表。

请注意我使用的是dd / MM / yyyy表示法

这是它当前设置的方式(小摘录,这是解释所需输出的SELECT语句):

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月1 + 2 + 3和2月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

我很清楚可以改进数据库结构来简化这个,但遗憾的是这是一个遗留应用程序,我无法改变结构。

任何人都可以指出我正确的方法来组合这两列。

我希望我能够清楚地描述我的问题。另外,请问:)

1 个答案:

答案 0 :(得分: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'