2

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

在我的数据库中,我有 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),每个课程周期将有 2ExtraDays行包含“额外天数”。

这些表看起来像这样:

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

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

谁能指出我以正确的方式组合这两列。

我希望我对你的问题描述得足够清楚。否则,请问:)

4

1 回答 1

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'  
于 2013-03-19T10:58:15.300 回答