出勤表
id name 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 month year
1 abcd P P P HOLIDAY P P P P P P HOLIDAY P P P P P P HOLIDAY P P P P P P HOLIDAY P P P P P P 01 2014
你可以看到上面是一个考勤表。一名成员abcd参加了1月份的所有日子。所以她一月份的现在总日数是27。
所以在这个表中我想添加另一个字段,它将显示特定月份成员的总当前天数。
请告诉我如何从这张表中计算当天(P)的数量。
CREATE TABLE `attendance` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`Ecode` varchar(100) NOT NULL,
`Ename` varchar(100) NOT NULL,
`01` varchar(200) NOT NULL,
`02` varchar(200) NOT NULL,
`03` varchar(200) NOT NULL,
`04` varchar(200) NOT NULL,
`05` varchar(200) NOT NULL,
`06` varchar(200) NOT NULL,
`07` varchar(200) NOT NULL,
`08` varchar(200) NOT NULL,
`09` varchar(200) NOT NULL,
`10` varchar(200) NOT NULL,
`11` varchar(200) NOT NULL,
`12` varchar(200) NOT NULL,
`13` varchar(200) NOT NULL,
`14` varchar(200) NOT NULL,
`15` varchar(200) NOT NULL,
`16` varchar(200) NOT NULL,
`17` varchar(200) NOT NULL,
`18` varchar(200) NOT NULL,
`19` varchar(200) NOT NULL,
`20` varchar(200) NOT NULL,
`21` varchar(200) NOT NULL,
`22` varchar(200) NOT NULL,
`23` varchar(200) NOT NULL,
`24` varchar(200) NOT NULL,
`25` varchar(100) NOT NULL,
`26` varchar(200) NOT NULL,
`27` varchar(200) NOT NULL,
`28` varchar(200) NOT NULL,
`29` varchar(200) NOT NULL,
`30` varchar(200) NOT NULL,
`31` varchar(200) NOT NULL,
`total_p` varchar(200) NOT NULL,
`total_sl` varchar(100) NOT NULL,
`total_al` varchar(100) NOT NULL,
`month` varchar(200) NOT NULL,
`year` varchar(200) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=latin1
答案 0 :(得分:1)
您的表定义将如下所示。
CREATE TABLE `attendance` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(255) ,
`1` VARCHAR(10),
`2` VARCHAR(10),
`3` VARCHAR(10),
...
`31` VARCHAR(10),
`month` INT(11),
`year` INT(11),
PRIMARY KEY (`id`)
)
您的p计数器表达式在SQL
中将如下所示SELECT name,
IF(`1`='P',1,0)+IF(`2`='P',1,0)+IF(`3`='P',1,0)+IF(`4`='P',1,0)+
etc. etc. +IF(`31`='P',1,0) AS pcount,
month,
year
FROM attendance
如果这看起来像一个讨厌的表达,那是因为它是。我希望你能理解这是一个真正难以维护的表定义。
修改强> 每人每天一排可以更好地工作。出勤表可能如下所示:
id int
name varchar
day DATE
attendance varchar(10)
然后,您可以使用传统的SQL聚合报告生成一份显示每月出勤率的报告,如下所示。
SELECT name,
DATE_FORMAT('%Y-%m-01') AS month_beginning,
SUM(IF(attendance = 'P', 1, 0)) AS days_present
FROM attendance
GROUP BY name, DATE_FORMAT('%Y-%m-01')
ORDER BY name, DATE_FORMAT('%Y-%m-01')
答案 1 :(得分:0)
您好,欢迎来到堆栈溢出!
是的,可能有更好的方法来存储您的数据,但很容易解决您的问题。我假设你已经知道如何获得你的$ row变量,如果不是只留下评论,我会告诉你如何。话虽如此,代码是这样的:
$attendance = 0;
for ($index = 1;index <= 31;index++) {
if ($row[' . strval($index) . '] === "P") {
$attendance++;
}
}
echo "Attendance is " . strval($attendance) . " days";
答案 2 :(得分:0)
由于我无法发表评论(因为所需的声誉),我只是在这里发表我的建议,
你能告诉我们你桌子的结构吗?试试这个命令,然后发布输出。 SHOW CREATE TABLE 'your attendance table Name'
(更新)你需要改变你的表结构,你可以创建这样的东西,而不是规范化,但至少可能这可以帮助你。
CREATE TABLE `attendance` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`Ecode` varchar(15) NOT NULL,
`Ename` varchar(100) NOT NULL,
`date` DATE NOT NULL,
`status` char(1) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=latin1;
在status
字段,你尝试使用P - present,H - holiday,A-缺席......
你的出勤表将如下所示:
------------------------------------------------
id | Ecode | Ename | date | status |
-----------------------------------------------
1 | code1 | Jane Doe |2014-01-05 | P
-----------------------------------------------
2 | code1 | Jane Doe |2014-01-06 | A
----------------------------------------------
...
然后,您可以查询以下内容:
SELECT Ecode, Ename, count(status) as numberOfpresent
FROM attendance WHERE status = 'P'
GROUP By Ecode;