mysql中一行中总现值的总和

时间:2014-02-05 03:31:34

标签: 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月份的所有日子。所以她一月份的现在总日数是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

3 个答案:

答案 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;