繁体   English   中英

使用数据透视表查询的动态列

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM