2017-01-27 4 views
1

顧客のフィールドに多数の行が割り当てられていないが、salesフィールドに値がある顧客レベルのデータを扱っています。これらの行の売上高を、割り当てられていない顧客を顧客と一緒に行に割り当てることを希望します。この割り当ては、指定顧客にすでに割り当てられている売上に比例して行いたいと思います。最後に、割り当てられていない顧客がいる行をテーブルから削除したいと思います。例えば、私のデータは、おおよそ次のようになります。上記の例でSQL Serverは指定された行から条件の他の行に値を割り当てます。

 Year  Market  Customer  Sales 
    2016  China  A    100 
    2016  China  B    150 
    2016  China  Not assigned 200 
    2015  Europe  D    100 

、Iは(年市場は3行に等しい場合)、行1及び2に割り当てられる3番目のレコードの売上値を希望します売上高に比例してこのように、ファイナルテーブルには、次のようになります。起動するには

Year Market  Customer Sales 
    2016 China  A   180 
    2016 China  B   270 
    2015 Europe  D   100 

、私は、割り当てに関連する寸法でグループ化された各「割り当てられていない」行、で新しいテーブルを作成しました。

SELECT * 
INTO [dbo].[notassignedtable] 
FROM(
    SELECT YEAR, Market, Customer, sum(Sales) as Sales 
    FROM table 
    WHERE Customer = 'Not assigned' 
    GROUP BY YEAR, Market, Customer 
) grouped 

これは正しい方向へのステップですか?ここからどこに行くのかに問題があります。

ありがとうございます!

+0

結果を得るために、元の売上高で追加! – Wilson

答えて

0

は、ここでこれはこれが割り当てられていない量を見つけるために使用される

[Sales]/Sum(CASE WHEN [Customer] <> 'Not assigned' THEN [Sales] ELSE 0 END) OVER(partition BY [Year], Market) 

各顧客ごとの寄与を見つけるために使用される

SELECT * 
FROM 
    (SELECT *, 
    [Sales] + ([Sales]/SUM(
    CASE 
     WHEN [Customer] <> 'Not assigned' 
     THEN [Sales] 
     ELSE 0 
    END) OVER(partition BY [YEAR], Market) * SUM(
    CASE 
     WHEN [Customer] = 'Not assigned' 
     THEN [Sales] 
     ELSE 0 
    END) OVER(partition BY [YEAR], Market)) AS result 
    FROM Yourtable 
) a 
WHERE [Customer] <> 'Not assigned' 

一つの方法である

Sum(CASE WHEN [Customer] = 'Not assigned' THEN [Sales] ELSE 0 END) OVER(partition BY [Year], Market)) 

額面金額での拠出金額の積算

([Sales]/Sum(CASE WHEN [Customer] <> 'Not assigned' THEN [Sales] ELSE 0 END) OVER(partition BY [Year], Market) 
        * Sum(CASE WHEN [Customer] = 'Not assigned' THEN [Sales] ELSE 0 END) OVER(partition BY [Year], Market)) 

が、これはSQL Serverである

[Sales] + ([Sales]/Sum(CASE WHEN [Customer] <> 'Not assigned' THEN [Sales] ELSE 0 END) OVER(partition BY [Year], Market) 
        * Sum(CASE WHEN [Customer] = 'Not assigned' THEN [Sales] ELSE 0 END) OVER(partition BY [Year], Market)) AS result 
関連する問題