【问题标题】:SQl rows to columns conversionSQL 行到列的转换
【发布时间】:2010-03-20 08:19:59
【问题描述】:

我有一个表 ClassAttendance,我正在使用 MSSQL 2005

studentID    attendanceDate    status
-------------------------------------
*1004          2010-03-17        0
 1005          2010-03-17        1
 1006          2010-03-17        0
 1007          2010-03-17        0
*1004          2010-03-19        0
 1005          2010-03-19        1
 1006          2010-03-19        0
 1007          2010-03-19        0
*1004          2010-03-20        1

如您所见,studentID 是一个名为 StudentData 的表的外键,并且 AttendedDate 的行数未知。

我可以通过使用查询获得如下输出吗?我需要将一个月中的日期作为列,并且日期列的值将是状态列中的值。每个学生 ID 的日期记录数与出席日期字段中未知的日期数相同。

studentID   2010-03-17   2010-03-19   2010-03-20
------------------------------------------------    
1004            0            0            1

等等。 这是为了创建报告,所以我需要在查询中进行。如果可以的话,请帮忙。

【问题讨论】:

    标签: sql sql-server-2005 tsql pivot


    【解决方案1】:

    您可以使用 PIVOT。看看this article

    【讨论】:

    • 是的,这可行,但问题是您必须事先知道字段值才能使用,不是吗?这里的问题是不知道每个月将在表中插入多少个日期,也不知道日期......我怎样才能将日期作为列名?这个例子没有显示。
    【解决方案2】:

    也许使用SQL 2005 PIVOT clause 的东西? (另见:msdn

    【讨论】:

    • 是的,这可行,但问题是您必须事先知道字段值才能使用,不是吗?这里的问题是不知道每个月将在表中插入多少个日期,也不知道日期...
    【解决方案3】:

    在报告中使用Matrix control(或在 Access 报告中使用 CrossTab,或在您的客户端工具中使用等效项)

    SQL 是一种固定的列定义/合同语言,您不知道您将拥有多少列。这实际上不是 SQL 问题,而是表示问题。

    除非您使用动态 SQL PIVOT...而不是 SQL Server 2005+ PIVOT 命令,后者又是固定的已知列

    【讨论】:

    • 谢谢老兄,但我想要它作为报告,如果我可以使用查询获得结果,我更愿意!
    • 报告意味着演示。如果需要,您可以在 Excel 中进行交叉表。但是 SQL 不适合这样做。
    猜你喜欢
    • 2015-01-18
    • 2014-09-08
    • 2017-01-18
    • 1970-01-01
    • 2020-04-28
    • 2011-10-04
    • 1970-01-01
    相关资源
    最近更新 更多