1

私はこれを単純化します:

正常に機能する2つのSQL式があります。

初め:

select count(*) as number1
 from T1
where DATE1>'2012-01-01' and DATE2<'2012-12-31'

結果:13

select  count(*) as number2 
from T1
where DATE3>DATE2 and CURDATE()>DATE2

結果:5

しかし、これら2つのCOUNTSをGROUP BYに挿入しようとすると、常に13の結果が得られます!!!

SELECT NAME,
 COUNT(case when DATE1>'2012-01-01' and DATE2<'2012-12-31' then 1 else 0 end) as number1, 
COUNT (case when (DATE3>DATE2 and CURDATE()>DATE2) then 1 else 0 end) as number 2
from T1

私は結果として得ています:

NAME  NUMBER1  NUMBER2
A       5         5
B       4         4
C       4         4

しかし、私は取得する必要があります:

NAME  NUMBER1  NUMBER2
A       5         4
B       4         0
C       4         1

したがって、最初の2つのクエリのように、列のSUMは13と5になります。私は何が間違っているのですか?ありがとうございました

4

4 に答える 4

4

COUNT(expression)null式ではありません。クエリを変更ELSE 0するELSE NULLか、削除することでクエリを変更できます(これELSE NULLは式で暗示されていCASEます)。

SELECT name,
    COUNT(CASE WHEN date1 > '2012-01-01' AND date2 < '2012-12-31' 
              THEN 1 END
         ) AS number1, 
    COUNT(CASE WHEN date3 > date2 AND CURDATE() > date2 
              THEN 1 END
         ) AS number2
FROM T1 
GROUP BY name ;
于 2013-01-16T18:23:02.437 に答える
1

ここではカウントを使用しないでください。合計を使用してください。カウントを使用する場合は、0ではなくelseにnullを入力します

于 2013-01-16T18:03:35.937 に答える
1

試す:

SELECT NAME,
(select count(*) from T1 where DATE1>'2012-01-01' and DATE2<'2012-12-31') AS number1,
(select count(*) from T1 where DATE3>DATE2 and CURDATE()>DATE2) AS number2
FROM T1
GROUP BY NAME
于 2013-01-16T18:05:32.843 に答える
1

これを試して:

SELECT name, 
       SUM(CASE WHEN DATE1>'2012-01-01' AND DATE2<'2012-12-31' THEN 1 ELSE 0 END) AS number1, 
       SUM(CASE WHEN (DATE3>DATE2 AND CURDATE()>DATE2) THEN 1 ELSE 0 END) AS number2 
FROM T1 GROUP BY name 
于 2013-01-16T18:21:24.867 に答える