2

私が直面している問題はおそらく簡単に修正できますが、問題の特異性のためにオンラインで答えを見つけることができないようです.

私のデータベースには、教育コースの計画方法を示す 3 つのテーブルがあります。というコースがあるとしWorking with Excelます。これは、テーブルCoursesにこのための行があることを意味します。

2 番目の表は、同じコースのサイクルを示します。コースが 2013 年 1 月 1 日と 2013 年 2 月 1 日に行われた場合、基礎となるテーブルCyclesには、日付ごとに 1 行ずつ 2 行が表示されます。

私は現在、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

問題は、まだ言及していない 3 番目のテーブルから情報を追加する必要があることです。テーブルExtraDaysには、サイクルが 1 日以上にわたる場合に備えて、追加の日数が含まれています。

たとえば、Working with Excel コースが 3 日間 (1 月 1+2+3 日と 2 月 1+2+3 日) かかる場合、各コース サイクルにはExtraDays「余分な日」を含む 2 つの行があります。

テーブルは次のようになります。

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

これを簡素化するためにデータベース構造を改善できることは承知していますが、残念ながらこれはレガシー アプリケーションであるため、構造を変更することはできません。

これら 2 つの列を組み合わせる正しい方法を教えてください。

私の問題を十分に明確に説明したことを願っています。それ以外の場合は、お尋ねください:)

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 に答える