Mysql 列不为空时计数总计
这是我要做的视觉演示- 7天名称为列。如果任何列包含任何数据(不是空的),那么它将计为1。 正在尝试获取每个usernmae的总计数。i、 亚当3岁,夏娃2岁,山姆1岁 我试过的-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` != ''
$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。谢谢,同样如此。