2017-06-08 11 views
-1

デバッグしていて、クエリでいくつかのテストを見ているうちに、私の結果の一部にNULLという値があることに気付きました。私はそれらを返すか、シニアのようにそのタイプに応じて0または0.00の値として見たいと思います。 where句と一緒に0または0.00の値を返します。MySQL

私はcase文でそれを試してみましたが、それは句がタイプに応じてどこ0

これを介して決定されている、私が望んでいた結果を取得できませんでした。ここで

は私のクエリです:ここで

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') 

は私の結果である:

enter image description here

私は0

+0

https://dev.mysql.com/doc/refman/5.7([ 'IFNULLを()']を参照してください。 /en/control-flow-functions.html#function_ifnull)関数を呼び出します。 – tadman

+0

この投稿はあなたに役立つのですか? https://stackoverflow.com/questions/1441333/mysql-typecasting-null-to-0 –

+0

これはよくある質問です。質問を次回Google明確に簡潔に記述してください。ブラウジング/グーグル・サイトを行った後:https://dev.mysql.com/doc/refman/5.7/en/。 – philipxy

答えて

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') 
+0

これは私が望む結果を得ました! IS NULL機能を持っていても合体を追加した場合の違いは何ですか? –

+0

@VirgilCruzまず、このクエリは面倒だと思います。その醜いサブクエリを取り除いて条件付き集計に置き換えることができます。あなたの質問に答える: 'ISNULL'と' COALESCE'の間には本当の違いはありません。彼らはお互いの同義語です。あなたはあなたが望むものを使うことができます。 –

+0

おかげでティム、私は一度私は1つのSELECTステートメントの声明で欲しいすべての結果を得た私の厄介なクエリを修正します –

0

としてNULL値がこの試すことにしたい:

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 
関連する問題