我有一张桌子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天的当月。
由于
答案 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甚至是网页。
您有几个问题需要解决:
第一个问题是将您用于表示周与月的任何值翻译成一系列日期。这不应该太难,但如果你发现它具有挑战性,可以发布另一个问题。
如果没有使用动态SQL(如Muthu所示),第二个在SQL Server中很难做到,因为PIVOT语句要求您事先知道列的所有标题是什么,并且您要编写这些标题值直接进入SQL语句。
但是在SSRS或Excel中很容易做到。 (在ASP.NET中也不是那么难,尽管你必须编写代码来完成它。)所以我建议你在任何你要进行格式化的环境中进行旋转。等等。 p>