[英]dynamic columns using pivot table query
我有这张出勤表
---------------------------------------------------------------------------
attendance_id | stud_id | week | sy |sem |present
---------------------------------------------------------------------------
1 | 1 | 02/18/2012 | 2010-2011 |1st semester|1
2 | 2 | 02/18/2012 | 2010-2011 |1st semester|1
3 | 3 | 02/18/2012 | 2010-2011 |1st semester|1
4 | 1 | 02/25/2012 | 2010-2011 |1st semester|1
5 | 2 | 02/25/2012 | 2010-2011 |1st semester|1
6 | 1 | 03/03/2012 | 2010-2011 |1st semester|1
7 | 2 | 03/03/2012 | 2010-2011 |1st semester|1
8 | 3 | 03/03/2012 | 2010-2011 |1st semester|1
我的查询是这个
Select cadet_record.fname,cadet_record.lname,cadet_record.mname, student_id,
MAX(case WHEN week = '02/18/2012' then present end) as 'week1',
MAX(case WHEN week = '02/25/2012' then present end) as 'week2'
From attendance
LEFT JOIN cadet_record ON cadet_record.stud_no = attendance.student_id WHERE section = '$section' AND schoolyear = '$year' AND component = '$component' AND semester = '$semester'
GROUP BY student_id
如何在不插入日期(例如02/28 / 2012、02 / 29/2012等)的情况下动态调用整个星期。 有任何想法吗? =(
据我所知,您不能动态地将列添加到SELECT语句中。 您需要的是一种表示数据的方式,而MySQL不在乎。 您应该在前端进行处理。
但是,您可以通过在模型中创建查询并通过向查询字符串中动态插入更多MAX(case...
来动态添加这些新列,从而作弊。但这并不是一个很好的解决方案。
编辑:
我正在使用php,我该怎么做?
所以,我想您是在谈论丑陋的解决方案。 好吧,基本上,您应该动态创建查询字符串(伪代码):
$initialDay = 02/28/2012;
$lastDay = 03/28/2012;
$dayNumber = 1;
$sql = 'Select cadet_record.fname,cadet_record.lname,cadet_record.mname, student_id';
while ($initialDay <= $lastDay) {
$sql .= ', MAX(case WHEN week = $initialDay then present end) as day' . $dayNumber;
$initialDay = $initialDay + 1 day;
$dayNumber++;
}
$sql .= ' From attendance blah blah...';
然后,您的查询应该看起来像这样,从2012年2月18日到2012年3月18日:
Select cadet_record.fname,cadet_record.lname,cadet_record.mname, student_id,
,MAX(case WHEN week = '02/18/2012' then present end) as day1
,MAX(case WHEN week = '02/19/2012' then present end) as day2
From attendance
LEFT JOIN cadet_record ON cadet_record.stud_no = attendance.student_id WHERE section = '$section' AND schoolyear = '$year' AND component = '$component' AND semester = '$semester'
GROUP BY student_id
请注意,我添加了几天而不是几周,因为您的示例显示的天数增加了,尽管列名是几周
无需透视表,您可以通过此查询获取每个学生的每周出勤率:
SELECT
cadet_record.fname,
cadet_record.lname,
cadet_record.mname,
student_id,
week,
SUM(present) AS att
FROM attendance
LEFT JOIN cadet_record
ON cadet_record.stud_no = attendance.student_id
WHERE section = '$section'
AND schoolyear = '$year'
AND component = '$component'
AND semester = '$semester'
GROUP BY week, student_id
ORDER BY week, cadet_record.fname, student_id
( 编辑抱歉,您应该使用SUM
,而不是COUNT
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.