2017-07-13 17 views
0

私は、このような計算割合

ID Name Product Quantity 
1 Rick Pen 10 
1 Rick Eraser 13 
1 Rick Ink 23 
2 Marge PostIt 13 
2 Marge Glue 7 
3 Frank Pen 13 
3 Frank Glue 6 
3 Frank Ink 8 

私は各顧客のために、私が手出力を取得したいなどの顧客データを含むテーブルを持っています特定の顧客の合計数量に基づいて各行の数量を決定する割合。たとえば、顧客1には、合計が46になる3つのアイテムがあります。したがって、最初の行は(10/46)* 100になり、およそ21.74%になります。これは、出力がどのように見えるかです。

ID Name Product Quantity Total 
1 Rick Pen 10 21.74 
1 Rick Eraser 13 28.26 
1 Rick Ink 23 50.00 
2 Marge PostIt 13 65.00 
2 Marge Glue 7 35.00 
3 Frank Pen 13 48.15 
3 Frank Glue 6 22.22 
3 Frank Ink 8 29.63 

ご協力いただければ幸いです。ありがとう。

答えて

2

あなたは以下のように以下のように

Select *, PercentSum = Format((Quantity*1.0)/(sum(Quantity) over(partition by Id)), 'p') 
    from yourtable 

出力によってパーティションに合計を使用することができます。

+----+-------+---------+----------+------------+ 
| Id | Name | Product | Quantity | PercentSum | 
+----+-------+---------+----------+------------+ 
| 1 | Rick | Pen  |  10 | 21.74 % | 
| 1 | Rick | Eraser |  13 | 28.26 % | 
| 1 | Rick | Ink  |  23 | 50.00 % | 
| 2 | Marge | PostIt |  13 | 65.00 % | 
| 2 | Marge | Glue |  7 | 35.00 % | 
| 3 | Frank | Pen  |  13 | 48.15 % | 
| 3 | Frank | Glue |  6 | 22.22 % | 
| 3 | Frank | Ink  |  8 | 29.63 % | 
+----+-------+---------+----------+------------+ 
+0

ありがとうKannan。これはまさに私が探していたものでした。とても有難い。 –

0

試しくださいこれはあなたの期待される結果

;With cte(ID, Name, Product, Quantity) 
AS 
(
SELECT 1,'Rick' ,'Pen' , 10 UNION ALL 
SELECT 1,'Rick' ,'Eraser' ,13 UNION ALL 
SELECT 1,'Rick' ,'Ink' , 23 UNION ALL 
SELECT 2,'Marge','PostIt' , 13 UNION ALL 
SELECT 2,'Marge','Glue' , 7 UNION ALL 
SELECT 3,'Frank','Pen' ,13 UNION ALL 
SELECT 3,'Frank','Glue' , 6 UNION ALL 
SELECT 3,'Frank','Ink' , 8 
) 
SELECT ID 
    ,NAME 
    ,Product 
    ,Quantity 
    ,CAST(ROUND(Quantity * 1./(
       SUM(Quantity) OVER (
        PARTITION BY ID ORDER BY ID 
        ) 
       ) * 100, 3) AS DECIMAL(4, 2)) AS [Total%] 
FROM cte 
ORDER BY 1,5 

結果を与える

ID Name Product Quantity Total% 
----------------------------------------- 
1 Rick Pen  10   21.74 
1 Rick Eraser 13   28.26 
1 Rick Ink  23   50.00 
2 Marge Glue 7   35.00 
2 Marge PostIt 13   65.00 
3 Frank Glue 6   22.22 
3 Frank Ink  8   29.63 
3 Frank Pen  13   48.15 
+0

返事@ Srini131をありがとう。私はクエリを実行しようとしましたが、エラーが発生しました: "数値をデータ型数値に変換する算術オーバーフローエラー。"私はKannanのソリューションを試してみました。ご協力ありがとうございました。 –

0

もしsum関数でpartition byをサポートしていないあなたが2008年またはそれ以上の年齢であれば、このようなことをすることができます。 2012年以降の場合は、私はKannanの回答を使用します。

declare @Something table 
(
    ID int 
    , Name varchar(10) 
    , Product varchar(10) 
    , Quantity int 
) 

insert @Something 
(
    ID 
    , Name 
    , Product 
    , Quantity 
) 
Values 
(1, 'Rick', 'Pen', 10) 
, (1, 'Rick', 'Eraser', 13) 
, (1, 'Rick', 'Ink', 23) 
, (2, 'Marge', 'PostIt', 13) 
, (2, 'Marge', 'Glue', 7) 
, (3, 'Frank', 'Pen', 13) 
, (3, 'Frank', 'Glue', 6) 
, (3, 'Frank', 'Ink', 8) 

select s.ID 
    , s.Name 
    , s.Product 
    , s.Quantity 
    , TotalPercentage = convert(numeric(5,2), (s.Quantity * 1.0/total.TotalPurchased) * 100) 
from @Something s 
cross apply 
(
    select sum(s2.Quantity) as TotalPurchased 
     , ID 
    from @Something s2 
    where s2.ID = s.ID 
    group by s2.ID 
) total 
+0

ありがとう@Sean。これは素晴らしいです。ご協力ありがとうございました。 –