Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.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使用cases获取所有行的总和_Mysql_Sql - Fatal编程技术网

MySQL使用cases获取所有行的总和

MySQL使用cases获取所有行的总和,mysql,sql,Mysql,Sql,我有一个MySQL表,当用户通过凭证付款时,它在数据库中记录值。它记录凭证的价值。我需要得到按凭证金额细分的所有凭证值的总和。我目前的查询如下。但是,butchery\u class\u凭证\u 155和butchery\u class\u凭证\u 135始终作为0返回 请帮忙解决这个问题 select case when voucher_value = '155.00' then round(sum(voucher_value/1.2), 2) else 0.0

我有一个MySQL表,当用户通过凭证付款时,它在数据库中记录值。它记录凭证的价值。我需要得到按凭证金额细分的所有凭证值的总和。我目前的查询如下。但是,
butchery\u class\u凭证\u 155
butchery\u class\u凭证\u 135
始终作为0返回

请帮忙解决这个问题

select 
case 
    when voucher_value = '155.00' 
    then round(sum(voucher_value/1.2), 2) 
    else 0.00 end 
as butchery_class_voucher_155,
case 
    when voucher_value = '10.00' 
    then round(sum(voucher_value/1.2), 2) 
    else 0.00 end 
as shop_voucher,
case when voucher_value = '135.00'      
    then round(sum(voucher_value/1.2), 2) 
    else 0.00 end 
as butchery_class_voucher_135,
ifnull(round(sum(final_price/1.2), 2),0.00) as paidbycard,
ifnull(round(sum(transfer_fee/1.2), 2),0.00) as transfer_fee 
    from `bookings` 
where `location_id` = 6

这个失败的原因是由于您设置案例陈述的方式。您已经编写了一个查询,如果凭证值等于某个值,则为您提供总和,或者为您提供零。在查询分析的最后一行,它将仅比较该凭证值,其他值将返回为0

要解决此问题,您需要调整
SUM()
函数,在值匹配的情况下添加凭证值,否则添加0:

SELECT ROUND(SUM(CASE WHEN voucher_value = 155 THEN (voucher_value / 1.2) ELSE 0 END), 2) AS butchery_class_voucher_155...

等等。

问题是在一个case中有sum()调用,即使case(或ifs)应该在sum()中。对于您的当前代码,如果第一条记录的凭证值为10,则只有shop_凭证表达式将给出除零以外的任何结果

select 
    round(sum(if(voucher_value=155,voucher_value/1.2,0)), 2) as butchery_class_voucher_155,
    ...
    from `bookings` 
where `location_id` = 6

你需要再考虑一件事:确切地说,你把舍入函数放在哪里。您可以先对结果求和,然后对其进行四舍五入(这是我在上面代码中使用的),或者您可以在每个部分应用四舍五入。

凭证值是文本字段吗?不是,它是十进制<代码>十进制(9,2)那么为什么要进行文本比较?@SunKnight0-即使我使用`=155`我仍然得到0.00作为结果。@SunKnight0:不重要,因为MySQL将进行隐式转换