Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 列不为空时计数总计_Mysql - Fatal编程技术网

Mysql 列不为空时计数总计

Mysql 列不为空时计数总计,mysql,Mysql,这是我要做的视觉演示- 7天名称为列。如果任何列包含任何数据(不是空的),那么它将计为1。 正在尝试获取每个usernmae的总计数。i、 亚当3岁,夏娃2岁,山姆1岁 我试过的- $sql="SELECT COUNT(*) as total FROM roster WHERE `username`='$username' AND `sat` != '' AND `sun` != '' AND `mon` != '' AND `tue` != '' AND `wed` != ''

这是我要做的视觉演示-

7天名称为列。如果任何列包含任何数据(不是空的),那么它将计为1。 正在尝试获取每个usernmae的总计数。i、 亚当3岁,夏娃2岁,山姆1岁

我试过的-

$sql="SELECT COUNT(*) as total FROM roster WHERE `username`='$username' 
AND `sat` != '' AND `sun` != '' AND `mon` != '' AND `tue` != '' AND
`wed` != '' AND `thu` != '' AND `fri` != ''";

如何操作?

要显示用户名组而不是单个用户名,请删除
username='$username'
,因为这样会将结果限制为单个用户名

而是按用户名列对值进行分组

按用户名分组
如果打算使用单个用户名
,其中username='$username'
,则不需要使用
GROUP BY
子句

COUNT()
通过计算结果集中的行数来工作

WHERE sat!=''还有太阳还有mon!=''星期二和wed然后呢!=''还有周五
将结果集限制为所有列都不是空的行

要在值不为空时适当地检索每个列的
total
值,需要删除
WHERE
子句,并用一系列
SUM(column!='')+SUM(column2!='')条件替换
COUNT(*)

查询

选择
用户名,
总和(星期六)+总和(星期日)+总和(星期一)+总和(星期二)+总和(星期三)+总和(星期四)+总和(星期五)
从名册上
按用户名分组;
结果

| username | total |
| -------- | ----- |
| adam     | 3     |
| eve      | 2     |
| sam      | 1     |
| username | Morning | Evening | Night |
| -------- | ------- | ------- | ----- |
| adam     | 2       | 1       | 0     |
| eve      | 1       | 0       | 1     |
| sam      | 0       | 1       | 0     |
|          | 3       | 2       | 1     |

如果
sat、sun、mon、tue、wed、thu、fi
列包含
NULL
'
,则将
SUM(col!='')替换为
SUM(IFNULL(col.)!='


数据透视表 要将结果显示为
晚间
上午
夜间
总计的数据透视表,您可以使用每个值的条件作为单独的列,并使用带有汇总的
按用户名分组
来显示总计

查询

选择
用户名,
SUM(星期六为“上午”)+SUM(星期日为“上午”)+SUM(星期一为“上午”)+SUM(星期二为“上午”)+SUM(星期三为“上午”)+SUM(星期四为“上午”)+SUM(星期五为“上午”)作为“上午”,
SUM(星期六为‘晚上’)+SUM(星期日为‘晚上’)+SUM(星期一为‘晚上’)+SUM(星期二为‘晚上’)+SUM(星期三为‘晚上’)+SUM(星期五为‘晚上’)作为‘晚上’,
SUM(星期六为‘夜’)+SUM(星期一为‘夜’)+SUM(星期二为‘夜’)+SUM(星期三为‘夜’)+SUM(星期四为‘夜’)+SUM(星期五为‘夜’)为‘夜’)`
从名册上
按用户名分组并汇总;
结果

| username | total |
| -------- | ----- |
| adam     | 3     |
| eve      | 2     |
| sam      | 1     |
| username | Morning | Evening | Night |
| -------- | ------- | ------- | ----- |
| adam     | 2       | 1       | 0     |
| eve      | 1       | 0       | 1     |
| sam      | 0       | 1       | 0     |
|          | 3       | 2       | 1     |

如果空列值为
NULL
s,则对7个布尔表达式求和:

SELECT username,
       (sat IS NOT NULL) + (sun IS NOT NULL) + (mon IS NOT NULL) + (tue IS NOT NULL) + 
       (wed IS NOT NULL) + (thu IS NOT NULL) + (fri IS NOT NULL) AS total 
FROM roster 
WHERE `username`='$username'

如果空列值也可能是空字符串:

SELECT username,
       (COALESCE(sat, '') <> '') + (COALESCE(sun, '') <> '') + (COALESCE(mon, '') <> '') + (COALESCE(tue, '') <> '') + 
       (COALESCE(wed, '') <> '') + (COALESCE(thu, '') <> '') + (COALESCE(fri, '') <> '') AS total 
FROM roster 
WHERE `username`='$username'
选择用户名,
(联合(星期六),“(联合(太阳)”)+(联合(星期一),“(联合”)+(联合(星期二)。”
(合并(星期三),“(合并”)+(合并(星期四),“(合并”)+(合并(星期五),”)总计
从名册上
其中`username`='$username'

您问题顶部的表格是您的实际数据还是您正在尝试做什么?@forpas:不是实际数据。我要做的是处理真实数据,计算每个用户名在sat、sun、mon中的职责。。每个day name列都有像早班、晚班、夜班这样的数据。然后发布示例数据以澄清您想要什么。@forpas:Updated我在之前的评论中问过您问题中最上面的表格是否是您的实际数据,而您的回答是否。那么您的示例数据在哪里呢?让我们不要接受此站点中的有毒行为+1。谢谢,同样如此。