sql – 交叉表 – 在同一列中存储不同的日期(Meeting1,Meeting2,Meeting 3等)

我需要跟踪不同的日期(动态).因此,对于特定任务,您可以跟踪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
点赞