我需要跟踪不同的日期(动态).因此,对于特定任务,您可以跟踪X个日期(例如DDR1会议日期,DDR2会议日期,截止日期等).
我的策略是创建一个表(DateTypeID,DateDescription),它将存储每个日期的描述.然后我可以创建主表(ID,TaskDescription,DateTypeID).因此,所有日期都在一列中,您可以通过查看TypeID来判断该日期代表什么.问题是在网格中显示它.我知道我应该使用交叉表查询,但我不能让它工作.例如,我在SQL Server 2000中使用Case语句来转移表,以便每个列名都是日期类型的名称.如果我们有以下表格:
日期类型表
DateTypeID | DateDescription
1 | DDR1
2 | DDR2
3 | DueDate
任务表
ID |任务描述
1 | Create Design
2 | Submit Paperwork
Tasks_DateType表
TasksID | DateTypeID |日期
1 | 1 | 09/09/2009
1 | 2 | 10/10/2009
2 | 1 | 11/11/2009
2 | 3 | 12/12/2009
结果应该是:
TaskDescription | DDr1 | DDR2 |截止日期
Create Design |09/09/2009 | 10/10/2009 | null
Submit Paperwork |11/11/2009 | null | 12/12/2009
如果有人知道如何研究这个,我很感激.我这样做的原因,而不是为每个日期创建一个列,有可能让用户在将来添加任意数量的日期,而无需手动添加列到表和编辑HTML代码.这也允许简单的代码来比较日期或按类型显示即将到来的任务(例如’创建设计的DDR1日期即将到来’)如果有人能指出我正确的方向,我很感激.
最佳答案 这是一个正确的答案,使用您的数据进行测试.我只使用了前两种日期类型,但无论如何你都可以动态构建它.
Select
Tasks.TaskDescription,
Min(Case DateType.DateDescription When 'DDR1' Then Tasks_DateType.Date End) As DDR1,
Min(Case DateType.DateDescription When 'DDR2' Then Tasks_DateType.Date End) As DDR2
From
Tasks_DateType
INNER JOIN Tasks ON Tasks_DateType.TaskID = Tasks.TaskID
INNER JOIN DateType ON Tasks_DateType.DateTypeID = DateType.DateTypeID
Group By
Tasks.TaskDescription
编辑
van提到没有日期的任务不会出现.这是对的.使用左连接(再次,由van提到)并重新构建查询将返回所有任务,即使这不是您现在需要的.
Select
Tasks.TaskDescription,
Min(Case DateType.DateDescription When 'DDR1' Then Tasks_DateType.Date End) As DDR1,
Min(Case DateType.DateDescription When 'DDR2' Then Tasks_DateType.Date End) As DDR2
From
Tasks
LEFT OUTER JOIN Tasks_DateType ON Tasks_DateType.TaskID = Tasks.TaskID
LEFT OUTER JOIN DateType ON Tasks_DateType.DateTypeID = DateType.DateTypeID
Group By
Tasks.TaskDescription