2016-07-21 9 views
1

以下は、group by文で集約カラムを使用するとエラーをスローするSQLクエリーです。 MySQLで効率的に行う方法をアドバイスしてください。GROUP BY文の集約カラムの使用 - MYSQL

select 
CASE 
    WHEN avg(sm.pace)<0.30 THEN 'Ineligible' 
    WHEN avg(sm.pace)>=0.30 AND avg(sm.pace)<0.40 THEN 'Tier1' 
    WHEN avg(sm.pace)>=0.40 AND avg(sm.pace)<0.50 THEN 'Tier2' 
    WHEN avg(sm.pace)>=0.50 AND avg(sm.pace)<0.75 THEN 'Potential' 
    WHEN avg(sm.pace)>0.75 THEN 'Inline' END AS Category, 
, ROUND(SUM(sm.balance_due),2) 
FROM SUMMARY sm 
GROUP BY Category 
+0

質問を編集し、サンプルデータと希望する結果を提供してください。クエリは意味をなさない。 –

+0

エラーをスローすると、メッセージを表示します – Jens

+0

しかし、あなたは 'case'式でも集計しています。 mysqlが許可するのは分かっていますが、一般的なルールは 'group by 'が定義されている場合、選択されたすべての属性は集約関数または' group by'のいずれかでなければなりません。それは他の方法でも機能します。集約関数が使用されている場合、 'group by 'は定義されなければならないか、または集合全体に集約されます(他の属性は選択できません) – HoneyBadger

答えて

0

あなたの質問は明らかではないが、私が見ることができるものから、あなたは、関数を作成し、ケースを使用して、適切な値を返します。それに値sm.paceを渡す必要があります。

0

avg()は本当に欲しくないと思います。

:これは何をしたい場合は

SELECT (CASE WHEN sm.pace < 0.30 THEN 'Ineligible' 
      WHEN sm.pace >= 0.30 AND sm.pace < 0.40 THEN 'Tier1' 
      WHEN sm.pace >= 0.40 AND sm.pace < 0.50 THEN 'Tier2' 
      WHEN sm.pace >= 0.50 AND sm.pace < 0.75 THEN 'Potential' 
      WHEN sm.pace > 0.75 THEN 'Inline' 
     END) AS Category, 
     ROUND(SUM(sm.balance_due), 2) 
FROM SUMMARY sm 
GROUP BY Category; 

は、あなたがCASE文が順に評価されているという事実を利用することにより、コードを簡素化することができます:あなたは、カテゴリごとに1つの行をしたい場合、これはあなたが望むものかもしれ

SELECT (CASE WHEN sm.pace < 0.30 THEN 'Ineligible' 
      WHEN sm.pace < 0.40 THEN 'Tier1' 
      WHEN sm.pace < 0.50 THEN 'Tier2' 
      WHEN sm.pace < 0.75 THEN 'Potential' 
      ELSE 'Inline' 
     END) AS Category, 
     ROUND(SUM(sm.balance_due), 2) 
FROM SUMMARY sm 
GROUP BY Category; 

注:NULLカテゴリに入れるのではなく、値を'Inline'投票に組み合わせます。