php - mysql中连续一行的总现值总和

标签 php mysql

考勤表

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 月份参加了所有天数。所以她在 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

最佳答案

您的表定义将如下所示。

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-counter 表达式在 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') 

关于php - mysql中连续一行的总现值总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21568121/

相关文章:

PHP 错误 -> 警告:mysqli_stmt::execute():无法获取 mysqli_stmt |警告:mysqli_stmt::close()

用于使用 MySql 的 C++ 库

mysql - mysql语句中的group_concat

php - 使用 PHP WebService 将图像插入 MySQL 数据库

PHP:检查文件是否直接加载而不是包含?

php - 从 zend 中的表中获取最近 7 天的记录

php - 如何为 PHP_Codesniffer 标准创建 PHP-UnitTest 案例?`

php - 如何在数据库mysql中插入当前日期

php - 使用无证书的 --ssl 使用 PHP PDO 连接到 MySQL/MariaDB

android - 如何在android中保存自定义对象列表(包含drawable)?