0

このクエリを実行すると、COUNT 関数は「check_if_new_customer」フラグでフィルタリングされません。この記事を読みました: http://dev.mysql.com/tech-resources/articles/wizard/page4.htmlより正確な結果を得るために、場合によっては COUNT の代わりに SUM を使用できますが、それを試してみると、私は非常に異なるものを手に入れました.それは数の大幅な倍増を示しているようです. これは、その時点でカウントするのではなく、id フィールドにある UUID を合計しているためである可能性があると思います。既存の顧客と新規顧客のすべてをカウントするためにそこに何を入れることができるかについて何か提案はありますか?

SELECT
  YEAR(so.date_entered),
  so.technical_address_country,
  so.technical_address_state,
  COUNT(so.id) as all_sales,
  COUNT(mf.id) as all_jobs,
  SUM(so.total_value) as all_value,
    COUNT(IF(so.check_if_new_customer=1,so.id,0)) as sales_order_new,
  SUM(IF(so.check_if_new_customer = 1,so.total_value,0)) as total_value_new,
    COUNT(IF(so.check_if_new_customer=1,mf.id,0)) as jobs_new,
    COUNT(IF(so.check_if_new_customer=0,so.id,0)) as sales_order_existing,
  SUM(IF(so.check_if_new_customer = 0,so.total_value,0)) as total_value_existing,
    COUNT(IF(so.check_if_new_customer=0,mf.id,0)) as jobs_existing,
    SUM(IF(so.check_if_new_customer=0,mf.id,0)) as jobs_existing_t
FROM 
  sugarcrm2.so_order so 
LEFT JOIN 
  sugarcrm2.mf_job mf on so.id = mf.sales_order_id 
WHERE 
  so.date_entered > "2011-10-30" AND 
    so.technical_address_country IS NOT NULL AND  
  so.technical_address_state IS NOT NULL AND 
  so.deleted = 0 AND 
  so.has_been_promoted = 1 
GROUP BY 
    YEAR(so.date_entered),
  so.technical_address_country, 
  so.technical_address_state
ORDER BY 
  so.technical_address_country, so.technical_address_state 
4

3 に答える 3

1

COUNT()引数が指定されている場合、その引数が non であるレコードの数を返しますNULL。この場合の引数はIF()式 (true の場合と false の場合に列の値に評価される) の結果であるため0、実質的にすべてのレコードがテスト条件に関係なくカウントされます。

SUM()は、その名前が示すように、引数の値を合計します。この場合、テスト条件が true の場合は常に参照列の値を合計します。

どうやらどちらもあなたが求めているものではありませんが、あなたの質問は正確に何を望んでいるのかについてかなり曖昧です. 推測では、次のようなものが必要になる場合があります。

SUM(so.check_if_new_customer)
于 2012-11-07T21:12:38.713 に答える
1

SUM()likeを使用する場合COUNT()は、1 または 0 を渡す必要があります。これにより、すべての 1 の合計が目的のカウントになります。したがって、あなたの例では、すべての新しいジョブの合計が必要な場合は、次のようにします。

SUM(IF(so.check_if_new_customer=1,1,0)) as jobs_new

または、so.check_if_new_customer が常に 1 または 0 を返す場合は、代わりにこれを行うこともできます。

SUM(so.check_if_new_customer) as jobs_new

于 2012-11-07T21:23:28.303 に答える
0

結合されたテーブルの id フィールドが null でないたびに +1 を合計したい。

SUM(IF(so.check_if_new_customer=0 AND mf.id IS NOT NULL,1,0)) as jobs_existing

于 2012-11-07T21:21:29.827 に答える