【问题标题】:Return a value of 0 or 0.00 along with where clause MySQL返回值 0 或 0.00 以及 MySQL 的 where 子句
【发布时间】:2017-06-08 02:43:47
【问题描述】:

当我调试并查看我的查询的一些测试时,我注意到我的一些结果具有 NULL 值。我想根据他们的类型返回它们或将它们视为 0 或 0.00 的值,就像高级一样。

我用 case 语句尝试过,但没有得到我想要的结果,即 0。

这是根据类型通过where子句确定的。

这是我的查询:

SELECT a.ID as EMPLOYEE, a.DOB as Date, a.AMOUNT as DECLARED, 
(SELECT (CASE WHEN 

SUM(gndsale.AMOUNT) and gndsale.ID IS NULL then "0" and gndsale.typeid = "10" else 
SUM(gndsale.AMOUNT) END) 
from gndsale where gndsale.ID= b.ID and 
gndsale.typeid = "10" and gndsale.DOB = a.DOB)  as `SENIOR DISCOUNT` 

FROM 
gndsale a INNER JOIN emp b ON a.ID= b.ID WHERE a.type = "22" and STR_TO_DATE(a.DOB, 
'%m/%d/%Y') BETWEEN '2017-05-01' AND '2017-05-31' GROUP BY DECLARED order by STR_TO_DATE(a.DOB, '%m/%d/%Y')

这是我的结果:

我想将 Null 值设为 0

【问题讨论】:

标签: mysql database join case


【解决方案1】:

一种方法是使用COALESCE() 包装您的子查询并使用零作为默认值:

SELECT
    a.ID AS EMPLOYEE,
    a.DOB AS Date,
    a.AMOUNT AS DECLARED, 
    COALESCE(
        (SELECT
            CASE WHEN SUM(gndsale.AMOUNT) AND gndsale.ID IS NULL AND gndsale.typeid = "10"
                 THEN 0 ELSE SUM(gndsale.AMOUNT) END
        FROM gndsale
        WHERE gndsale.ID = b.ID AND
              gndsale.typeid = "10" AND
              gndsale.DOB = a.DOB), 0) AS `SENIOR DISCOUNT` 
FROM gndsale a
INNER JOIN emp b
    ON a.ID = b.ID
WHERE a.type = "22" AND
      STR_TO_DATE(a.DOB, '%m/%d/%Y') BETWEEN '2017-05-01' AND '2017-05-31' 
GROUP BY DECLARED
ORDER BY STR_TO_DATE(a.DOB, '%m/%d/%Y')

【讨论】:

  • 这得到了我想要的结果!!请问,即使你有一个 IS NULL 函数,如果你添加了 coalesce 有什么区别?
  • @VirgilCruz 首先,我认为这个查询很混乱,我们可能可以摆脱那个丑陋的子查询并用条件聚合替换它。回答您的问题:ISNULLCOALESCE 之间没有真正的区别;它们是彼此的同义词。你可以使用任何你想要的。
  • 谢谢蒂姆,一旦我在一个 Select 语句中得到了我想要的所有结果,我就会修复我的凌乱查询
【解决方案2】:

试试这个:

select EMPLOYEE,`Date`,DECLARED,case when SENIOR_DISCOUNT is null then 0 else SENIOR_DISCOUNT end as `SENIOR DISCOUNT` from
(SELECT a.ID as EMPLOYEE, a.DOB as Date, a.AMOUNT as DECLARED, 
(SELECT (CASE WHEN 

SUM(gndsale.AMOUNT) and gndsale.ID IS NULL then "0" and gndsale.typeid = "10" else 
SUM(gndsale.AMOUNT) END) 
from gndsale where gndsale.ID= b.ID and 
gndsale.typeid = "10" and gndsale.DOB = a.DOB)  as `SENIOR_DISCOUNT` 

FROM 
gndsale a INNER JOIN emp b ON a.ID= b.ID WHERE a.type = "22" and STR_TO_DATE(a.DOB, 
'%m/%d/%Y') BETWEEN '2017-05-01' AND '2017-05-31' GROUP BY DECLARED order by STR_TO_DATE(a.DOB, '%m/%d/%Y')) as a

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-14
    • 2019-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    相关资源
    最近更新 更多