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 COUNT函数根据真列值对两列或更多列进行计数_Mysql_Count - Fatal编程技术网

mysql COUNT函数根据真列值对两列或更多列进行计数

mysql COUNT函数根据真列值对两列或更多列进行计数,mysql,count,Mysql,Count,我试图计算两列的赋值出现的次数。到目前为止,我使用的sql语句输出了错误的结果。看一看: SELECT UPPER(school.district) AS District_name, COUNT(DISTINCT task1.wp_status) AS Status_New, COUNT(task1.wp_type) AS Type_Bolehole FROM school RIGHT OUTER JOIN task1 ON school.s_name=tas

我试图计算两列的赋值出现的次数。到目前为止,我使用的sql语句输出了错误的结果。看一看:

SELECT 
    UPPER(school.district) AS District_name, 
    COUNT(DISTINCT task1.wp_status) AS Status_New, 
    COUNT(task1.wp_type) AS Type_Bolehole 
FROM school 
RIGHT OUTER JOIN task1 ON school.s_name=task1.name 
WHERE task1.wp_status="New" OR task1.wp_type="Bolehole" 
GROUP BY district AND task1.wp_status="New" AND task1.wp_type="Bolehole" 
ORDER BY district;
我使用的两个表格如下所示

School

s_name         district
matero          lusaka
kema            lusaka 
naka            kabwe

task1

name     wp_status   wp_type
matero     New      Bolehole                       
kema       New      Bolehole                    
naka       New    ProtectedWell
预期产量

D_Name Status_New Type_Bolehole         
KABWE       1       2
LUSAKA      2       0   
试试这个

SELECT UPPER(school.district) AS District_name,
sum( task1.wp_status ="New") AS Status_New, 
sum(task1.wp_type="Bolehole") AS Type_Bolehole FROM school 
RIGHT OUTER JOIN task1 ON school.s_name=task1.name 
WHERE task1.wp_status="New" OR task1.wp_type="Bolehole" 
GROUP BY district  
ORDER BY district;
此外,在预期结果集中,第一行的bolehole计数应为0,因为task
naka
没有bolehole类型


你不需要一个合适的加入。。您只需要行的一个条件和

SELECT
    UPPER(s.district) AS District_name,
    SUM(case when t.wp_status = 'New' then 1 else 0 end) AS Status_New,, 
    SUM(case when t.wp_type = 'Bolehole' then 1 else 0 end) AS Type_Bolehole 
FROM school s
LEFT JOIN task1 t ON s.s_name=t.name 
WHERE t.wp_status = 'New' or t.wp_type = 'Bolehole'
GROUP BY District_name
ORDER BY District_name;

我建议这样编写查询:

SELECT UPPER(s.district) AS District_name, 
       SUM(t1.wp_status = 'New') AS Status_New, 
       SUM(t1.wp_type = 'Bolehole') AS Type_Bolehole 
FROM school s JOIN
     task1 t1
     ON s.s_name = t1.name 
WHERE t1.wp_status = 'New' or t1.wp_type = 'Bolehole'
GROUP BY UPPER(s.district)
ORDER BY District_Name;
这将进行以下更改:

  • 表别名的引入使查询更易于读取和写入
  • 连接
    更改为
    内部连接
    。您在一个表上进行选择,而在另一个表上进行聚合,因此查询似乎希望两个表都匹配
  • 分组依据
    基于
    选择
    中使用的实际表达式
  • 条件聚合用于获取两列计数

注意:这假设问题中的示例结果不正确。

尝试将右外部联接更改为左联接。联接正常。我甚至可以使用WHERE子句。根据列值,计数部分存在问题。但是如果您没有正确加入,计数将不正确。我已更改,但仍然无法解决此问题。第二个表是一个包含更多列的表,因此右键连接Let's go伙计们。您的预期结果没有意义。。为什么卡布韦有两个?不是卢萨卡吗?我在用电话发帖,格式是别人写的。至少你有了这个想法。22分钟前你是怎么回答的?我刚看到你贴了?太好了!谢谢大家。@MKhalidJunaid,但我可以用一个向上的投票来抵消它:D,好了:)@MKhalidJunaid是的,我不知道谁会否决一个完美的答案。。让我困惑的是,WHERE对于数据来说是完全冗余的provided@JohnRuddell . . . 对。但是保留
where
子句可以使查询更高效,如果它可以使用索引(与三行无关,但其中一行假定实际数据更大)。。。哦,嘿,祝贺你打了20万