0

SUM フィールドの合計と mydate の間の WHERE をクエリする方法ですが、行はまだそこにあります。値の合計を 0 に変更するだけです。以下の説明を確認してください。

名前がcategory_resultresult_valuesの 2 つのテーブルがあります。

以下は、テーブルcategory_resultの構造と値です。

id       name   
1        One    
2        Two    
3        Three  
4        Four   
5        Five  

以下は、テーブルresult_valuesの構造と値です。

id_category_value       mydate         total
1                       2013-04-24     2
2                       2013-04-25     3
3                       2013-05-10     1
4                       2013-06-20     8
5                       2013-06-21     3
5                       2013-06-22     2
5                       2013-06-23     2

私のクエリは次のとおりです。

SELECT c.name, SUM(rv.total) as total_all FROM category_result c
LEFT JOIN result_values rv ON c.id=rv.id_category_value 
WHERE rv.mydate >= '2013-05-01' AND rv.mydate <= '2013-07-01'
GROUP BY c.id

そして、以下のような結果が得られます:

name      total_all
Three     1
Four      8
Five      7

しかし、私が望むのはそのようなものではなく、大まかに次のような結果になりたいです:

name      total_all
One       0
Two       0
Three     1
Four      8
Five      7

名前がまだそこにあることを望んでいましたが、上記の mydate の場所の場合、名前 One と Two は mydate によってリストされていないため、行の値 total_all を null または 0 にする必要があります。

前もって感謝します。

4

3 に答える 3

2

where句を結合に移動するだけです。そうしないと、日付のないすべての category_results が除外されます。

SELECT c.name, COALESCE(SUM(rv.total),0) as total_all 
FROM category_result c
LEFT JOIN result_values rv ON c.id=rv.id_category_value AND rv.mydate >= '2013-05-01' AND rv.mydate <= '2013-07-01'
GROUP BY c.id

COALESCE を使用しないと、One と Two の合計が 0 ではなく null になることに注意してください。

于 2013-09-11T07:20:49.560 に答える
1

別の結合を使用してください。

SELECT t1.name, t2.total_all
FROM category_result t1
LEFT JOIN
(
SELECT c.id, SUM(rv.total) as total_all FROM category_result c
LEFT JOIN result_values rv ON c.id=rv.id_category_value 
WHERE rv.mydate >= '2013-05-01' AND rv.mydate <= '2013-07-01'
GROUP BY c.id
) t2 ON t1.id = t2.id
于 2013-09-11T07:16:32.373 に答える
1

クエリSumをネストされたクエリJOINにし、データを使用して

SELECT ct.name, ISNULL(s.total_all, 0) FROM category_result cr
LEFT JOIN (
  SELECT id_category_value, SUM(rv.total) as total_all FROM result_values  
  WHERE rv.mydate >= '2013-05-01' AND rv.mydate <= '2013-07-01'
  GROUP BY c.id
) s rv ON cr.id = s.id_category_value

そして、Whereステートメントは移動できます。

于 2013-09-11T07:16:58.650 に答える