2017-02-03 6 views
0

"qual"列のaの各寄稿者に対する売上高に対する%貢献度を計算しようとしています。行の合計に対する単一行の割合の計算 - Teradata SQL

loc | qual | sales 
- - - - - - - - - - - - 
us | a | 1,000 
us | b | 500 
gc | a | 200 
gc | b | 400 

だから私が探していることになる答えは米国である= 66.66パーセント(千/ 1500)及びGC = 33.33パーセント(600分の200)。返品の結果は....

loc | Pct 
us | 66.66% 
gc | 33.33% 

ありがとう!

答えて

0

あなたは集約およびウィンドウ関数でこれを行うことができます。

select loc, count(*) as sales, sum(count(*)) over() as total_sales, 
     count(*)/sum(1.0*count(*)) over() as sales_proportion 
from t 
group by loc; 

salesが本当に整数である場合には、(あなたが1.0でわずか複数の缶)浮動小数点または10進数表現に変換する必要があります。

EDIT:

おっと、上記し便利なものではなく、OPが求めてきました。最も簡単な方法は次のとおりです。

select loc, 
     avg(case when qual = 'a' then 1.0 else 0 end) as proportion_a 
from t 
group by loc; 
+0

ありがとうございます!私はあなたのソリューションを使用している間、実際には間違いを認識しました。 「売上」列には実際にtransactionsIDが設定されているため、各ロットの合計トランザクションに対して「a」のトランザクション数を見つける必要があります。これはカウントで可能ですか? 申し訳ありませんが、不正なフォーマットです! Tからtotal_proportion として)(上(トランザクションID)/カウント(COUNT(トランザクションID))をカウントし、TotalTransactionsとして LOC、 カウント(トランザクションID)トランザクションなど、 カウント(COUNT(トランザクションID))(上)を選択グループ別の – Bocean

+0

No。 。 。 'sum(count(TransactionId))'が必要です。 –

+0

@Bocean。 。 。いずれにせよ、私は間違った質問に答えました。編集を参照してください。 –

0

%を計算するには、locで合計する必要があります。しかし、あなたはlocとgroupでグループ化することは望ましくありません。これは、保持したいテーブルの部分を破壊し、結果のテーブルをあなたがここにあるテーブルに戻すことになるからです...もっと簡単です方法。そしてそれが、相関サブクエリが入ってくるところです!テーブル内のlocに関連付けられた売上をカウントする副選択を実行することができます。次のコードは、あなたが望むものを与えるはずです。

select loc, 
     sales * 100/(
      select sum(sales) 
      from my_table sq 
      where sq.loc = t.loc 
     ) as pct 
    from my_table t 
    where qual = 'a' 

希望します。

1

あなたは条件付き集計が必要になります。

select loc, 
    100.00 
    * sum(case when qual = 'a' then sales else 0 end) -- only 'a' sales 
    /sum(sales) as Pct        -- all sales 
from tab 
group by loc 

変更100.00 *の精度ニーズに応じて。

salesのデータ型がFLOATまたはNUMBERでない限り、最初に100 *を掛けてから除算する必要があります。