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

时间:2014-05-16 17:44:28

标签: sql sql-server-2008

我有一张桌子tbl_student

s_id | name
-----+-------
   1 | peter
   2 | robert
   3 | stive

和一个表tbl_attendance

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周的7天 如果基于这个月,我希望结果中有30天的当月。

由于

2 个答案:

答案 0 :(得分:0)

您可以尝试以下操作,并可以通过更改位来使用相同的内容。

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)

答案 1 :(得分:0)

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

您有几个问题需要解决:

  1. 如何获得您想要的日期,具体取决于指定的参数(周与月)
  2. 如何转动数据,以便日期在页面上水平排列,学生名称垂直排列
  3. 第一个问题是将您用于表示周与月的任何值翻译成一系列日期。这不应该太难,但如果你发现它具有挑战性,可以发布另一个问题。

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

    但是在SSRS或Excel中很容易做到。 (在ASP.NET中也不是那么难,尽管你必须编写代码来完成它。)所以我建议你在任何你要进行格式化的环境中进行旋转。等等。 p>