1. ホーム
  2. sql

[解決済み] による分割の和

2022-03-02 17:04:35

質問

何が足りないのでしょうか?

このクエリは、重複したデータを何度も何度も返します。 カウントは完全な合計で正しいのですが、1行を期待しているのに、約40回繰り返された値が返されます。 何かアイデアはありますか?

SELECT BrandId
      ,SUM(ICount) OVER (PARTITION BY BrandId ) 
  FROM Table 
WHERE DateId  = 20130618

これでいいか?

BrandId ICount
2       421762
2       421762
2       421762
2       421762
2       421762
2       421762
2       421762
1       133346
1       133346
1       133346
1       133346
1       133346
1       133346
1       133346

何が足りないのか?

クエリ全体がこのような状態なので、パーティションを削除できません。

SELECT BrandId
       ,SUM(ICount) OVER (PARTITION BY BrandId) 
       ,TotalICount= SUM(ICount) OVER ()    
        ,SUM(ICount) OVER () / SUM(ICount) OVER (PARTITION BY BrandId)  as Percentage
FROM Table 
WHERE DateId  = 20130618

これを返します。

BrandId (No column name)    TotalICount Percentage
2       421762              32239892    76
2       421762              32239892    76
2       421762              32239892    76
2       421762              32239892    76
2       421762              32239892    76
2       421762              32239892    76

私は、distinctを使わなくても、このような出力が得られると期待しています。

BrandId (No column name)    TotalICount Percentage
2       421762              32239892    76
9       1238442             32239892    26
10      1467473             32239892    21

解決方法は?

を使用することができます。 DISTINCT を削除するか、あるいは PARTITION BY の部分を削除し GROUP BY :

SELECT BrandId
       ,SUM(ICount)
       ,TotalICount = SUM(ICount) OVER ()    
       ,Percentage = SUM(ICount) OVER ()*1.0 / SUM(ICount) 
FROM Table 
WHERE DateId  = 20130618
GROUP BY BrandID

もし、合計をブランドIDごとのカウントで割るのが間違いであり、合計のパーセントを求めるのであれば、上記のビットを逆にしてください。

SELECT BrandId
           ,SUM(ICount)
           ,TotalICount = SUM(ICount) OVER ()    
           ,Percentage = SUM(ICount)*1.0 / SUM(ICount) OVER () 
    FROM Table 
    WHERE DateId  = 20130618
    GROUP BY BrandID