有关sql server 2008考勤报告的查询

有关sql server 2008考勤报告的查询,sql,sql-server-2008,Sql,Sql Server 2008,我有一张桌子供你的学生用 s_id | name -----+------- 1 | peter 2 | robert 3 | stive 还有一张桌子,不限出席人数 id | s_id | status | date ---+------+--------+---------- 1 | 1 | p | 5-16-2014 2 | 2 | p | 5-16-2014 3 | 3 | a | 5-16-2014 4 |

我有一张桌子供你的学生用

s_id | name
-----+-------
   1 | peter
   2 | robert
   3 | stive
还有一张桌子,不限出席人数

id | s_id | status |   date
---+------+--------+----------
 1 |    1 |     p  | 5-16-2014
 2 |    2 |     p  | 5-16-2014
 3 |    3 |     a  | 5-16-2014
 4 |    1 |     p  | 5-17-2014
 5 |    2 |     a  | 5-17-2014
 6 |    3 |     a  | 5-17-2014
 7 |    1 |     p  | 5-18-2014
 8 |    2 |     a  | 5-18-2014
 9 |    3 |     p  | 5-18-2014
我想以这种格式显示结果

s_id | name   | 5-16-2014 | 5-17-2014 | 5-18-2014
   1 | peter  |         p |         p |         p
   2 | robert |         p |         a |         a
   3 | stive  |         a |         a |         p
选择应基于:

  • 本周
  • 这个月
如果基于本周,我希望结果中包含当前周的7天。
如果是基于这个月,我希望在结果中包含当月的30天


谢谢

您可以尝试以下方法,也可以通过稍加更改来使用

CREATE TABLE [dbo].[Student](
    [ID] [int] NULL,
    [Name] [varchar](50) NULL
) ON [PRIMARY]

CREATE TABLE [dbo].[Attendance](
    [ID] [int] NOT NULL,
    [S_ID] [int] NOT NULL,
    [Status] [char](1) NOT NULL,
    [Date] [datetime] NOT NULL
) ON [PRIMARY]

-- Inset values to the above tables.

DECLARE @Dates VARCHAR(MAX),
        @Sql VARCHAR(Max)
SELECT @Dates = stuff((select distinct ',['+ CONVERT(VARCHAR,Date,106) + ']' from Attendance for xml path('')),1,1,'')
SET @Sql = ';WITH T AS(SELECT S_ID, Status, Date FROM Attendance)SELECT * FROM T PIVOT(MAX(Status) FOR Date IN(' + @Dates + ')) As StatusSt'
EXEC(@Sql)

既然您说这是用于考勤报告,我假设您打算在其他工具中格式化和显示数据,例如Excel、SSRS,甚至是网页

您有几个问题需要解决:

  • 如何根据指定的参数(周与月)仅获取所需的日期
  • 如何透视数据,使日期在页面上水平排列,学生姓名垂直排列
  • 第一个问题是将用于表示周与月的值转换为一系列日期。这应该不太难做到,但如果你觉得这很有挑战性,就再发一个问题

    第二个问题在SQL Server中很难不使用动态SQL(如Muthu所示),因为PIVOT语句要求您事先知道列的所有标题是什么,并将这些值直接编码到SQL语句中


    但在SSRS或Excel中很容易做到。(这在ASP.NET中也不难,尽管你需要编写代码来完成。)因此我建议你在任何环境下进行数据透视,你要在其中进行格式化等等。

    你能展示一下你迄今为止所做的工作,以及查询未能提供你想要的内容的地方吗?