2016-11-30 8 views
-2

私はpostgresqlの共通の問題を知っていますが、私はstackoverflowで多くのソリューションを試しましたが、結果が得られませんでした。カラムは、postgresqlのgroup by句のエラーに表示する必要があります

これはphpPGAdminクエリブラウザで実行している私のクエリです。

SELECT target_financial_advisor, 
    acquiror_finanial_advisor, 
    target_nation, 
    acquiror_nation, 
    rank_value, 
    rank_date 
FROM ma_global 
WHERE target_nation = 'France' 
    AND acquiror_nation = 'France' 
    AND EXTRACT(YEAR 
      FROM "rank_date") = 2013 
    AND rank_date IS NOT NULL 
GROUP BY target_financial_advisor, 
    acquiror_finanial_advisor LIMIT 50; 

このクエリは、私がgroup by句を使用しますが、私はその後、GROUPBYせずにそれを実行した場合、それが動作するかどうか、その理由は、私は通常、MySQLで動作しているかわからない、これはで私の最初のクエリでは動作しません。 postgresqlは、mysqlでうまく動作します。

エラー

ERROR: column "ma_global.target_nation" must appear in the GROUP BY clause or be used in an aggregate function LINE 4: target_nation, acquiror_nation,

+0

"rank_dateは" 結構ですか? –

+0

はい、rank_date条件を削除しても、同じ問題が発生します – Pankaj

+3

エラーはクリアです。グループ化する場合は、すべての戻り値を集計で使用するか、グループ化セレクタに表示する必要があります。 target_nationに200の異なる値がある場合は、どの値を返す必要がありますか?あなたは指定しません。これはMySQLではなく、適切なデータベースです。 –

答えて

1

GROUP BY句はGROUP BYが集計されないすべての結果の列を含んでいなければならないSELECT句に通常、凝集カラムの混合を可能にします。あなたの声明を正しくするために、をGROUP BY句に入れることもできます。ただし、集計がないため、この句を削除する方が簡単です。あなたが重複する行を取得する場合、あなたはSELECT句にDISTINCTを追加する必要があります

SELECT DISTINCT target_financial_advisor, 
    acquiror_finanial_advisor, 
    target_nation, 
    acquiror_nation, 
    rank_value, 
    rank_date 
FROM ma_global 
WHERE target_nation = 'France' 
    AND acquiror_nation = 'France' 
    AND EXTRACT(YEAR 
     FROM "rank_date") = 2013 
    AND rank_date IS NOT NULL 
LIMIT 50; 
+0

ああ、これは主な理由です、私は最後の4時間この問題に取り組んでいます、助けてくれてありがとう:) – Pankaj

1

を使用すると、2列で選択し、グループでの6列を持っているので、私は、あなたが達成したいのかわからないんだけど...これ'poor old postgres'はあなたが他の4つのカラムで何をしたいか分からない...グループを使用している場合は、すべてのカラムをグループ単位で表示するか、集計関数で表示する必要があります。あなたがこの4つの列にあるものに興味がないなら(またはWHERE節にあるのでそれを知っている)、それをselectから削除してください...基本的なSQL規則です。

これは動作します:

SELECT target_financial_advisor, 
    acquiror_finanial_advisor, 
    target_nation, 
    acquiror_nation, 
    rank_value, 
    rank_date 
FROM ma_global 
WHERE target_nation = 'France' 
    AND acquiror_nation = 'France' 
    AND EXTRACT(YEAR 
      FROM "rank_date") = 2013 
    AND rank_date IS NOT NULL 
GROUP BY 1,2,3,4,5,6 LIMIT 50; 

た場合、またはWHERE句から列をommiting:

SELECT target_financial_advisor, 
    acquiror_finanial_advisor, 
    rank_value 
FROM ma_global 
WHERE target_nation = 'France' 
    AND acquiror_nation = 'France' 
    AND EXTRACT(YEAR 
      FROM "rank_date") = 2013 
    AND rank_date IS NOT NULL 
GROUP BY 1,2,3 LIMIT 50; 
関連する問題