2016-07-18 18 views
0

との集約が、私はこのようになりますテーブルには、各ブランドのためsales_shareを取得するようSQL - GROUPBYとパーティショニング

SELECT 
    brand, SUM(sales)/SUM(sales) OVER() as sales_share 
FROM sales 
GROUP BY brand 

だから私は、次のSQLクエリを使用していた

brand | model | sales   
--------+----------+------ 
brand1 | model11 | 100 
brand1 | model11 | 300 
brand2 | model21 | 100 
brand2 | model22 | 400 
brand3 | model31 | 100 

salesと呼ばれています以下のようになります

brand | sales_share   
--------+-------------- 
brand1 | 0.4 
brand2 | 0.5 
brand3 | 0.1 

しかし、私はエラーAttribute SALES.sales must be GROUPed or used in an aggregate function - どのポインタ?

+0

SUM(売上高)/ SUM(売上高)1で、かつオーバー削除して、正確な質問 – VISHMAY

+1

@VISHMAY尋ねる:: 'SUM(売上高)/ SUM(売上高)'実際にPostgresは

SQLFiddleは整数の除算を使用します。は1ですが、 'SUM(sales)/ SUM(sales)OVER()'は –

+0

期待しているのは "SUM(売上)/ SUM(売上)"ではなく "SUM(売上)/ SUM(売上)OVER()"で、同じではなく、1と等しくない。 (すべてのブランドの合計)/(1ブランドの合計) –

答えて

0

sqlを使用している場合は、選択する各属性ごとにグループ化する必要があります。あなたが使用することができます

SELECT 
    brand, SUM(sales)/SUM(sales) OVER() as sales_share 
FROM sales 
GROUP BY brand, sales 
+0

user3206440は、Postgresを使用しているので、明らかにSQLを使用しています。 "SQLを使用している場合"の部分は意味をなさない。 –

+0

たとえば、彼がMySQLを使用する場合、彼が必要としていたのは、ブランドごとのものでした。しかし、彼がアクセスを使用する場合は、彼が選択する各属性を含める必要があります。私は一度MySQLからSqlへのアクセスを変換したので、 "あなたはSQLを使用している"と言いました。これは私が話していることです。 http://stackoverflow.com/questions/37775543/mysql-query-to-ms-access-query @@a_horse_with_no_name – HasS

+0

クエリには 'postgresql'というタグが付けられていますが、なぜuser3206440がMySQLまたはMSを使用している可能性がありますかアクセス? –

0

select 
    brand, SUM(sales)as brand_sales 
into tmp 
from sales 
group by brand 

select brand , 
     total_sales /(select SUM(b.sales) from sales b) as total_sales 
from tmp 

drop table tmp 
+1

'tmp'テーブルはまったく必要ありません。 Plus: 'create table as .. select ..'は、select文に基づいてテーブルを作成するための好ましい方法です。 –

0

これを試してみてください:

SELECT 
    brand, SUM(sales)/SUM(SUM(sales)) OVER() as sales_share 
FROM sales 
GROUP BY brand 

はには何が欠けていた

select brand , sales_share/sum(sales_share) over() sales_share from (
    SELECT 
     brand, SUM(sales) as sales_share 
    FROM sales 
     GROUP BY brand 
    ) a 
1

次作品だからあなたのクエリは次のようになります元の試みは集約であったそうでない場合、あなたは小数点へのキャストが必要になる場合がありますsalesのデータ・タイプに応じて

SELECT brand, 
     sum(sales)/(select sum(sales) from sales) as sales_share 
FROM sales 
GROUP BY brand; 

: - 機能を正確に、エラーメッセージのようなあなたは本当にこのためのウィンドウ関数を必要としません:)

0
+0

これらのサブ選択肢は、パフォーマンスの観点から優れたプラクティスですか? – user3206440

+0

@ user3206440:はい、どうしてですか?これは一度だけ実行され、 'sum(sales)over()'を実行すると同じパフォーマンスが得られる可能性があります。あなたは 'explain(analyze、verbose)'を使ってそれを確認することができます。 –

+1

@ user3206440:あなたが正しいと思います;)これを100.000行でテストしましたが、あなたのバージョンは実際には少し速いです。 –

関連する問題