2017-07-16 38 views
0

我想計算組內的權重。假設我有一個像這樣的組表格,並且我想計算該組中所有產品值之和的產品價值的權重列。如何才能做到這一點?組內的Transact SQL計算

數據例如:

我想從該表中去:

Original Table

此表:

Table I want to create

這意味着權重列不存在。目標是創建一個包含所有原始列的新表格以及一個稱爲weight的新列。

重量計算示例:對於第5行B組產品x,重量計算爲重量= 10/40。

回答

1

您可以使用窗口功能來實現這一點。這裏是一個例子:

SELECT 
    1.0/(SUM([Value]) OVER (PARTITION BY [Group])) * [Value] AS [Weight] 
FROM [YourTable] 

我建議你在現有的表上(根據你的需要,當然)創建一個視圖。你可以這樣創建您的觀點:

CREATE VIEW [YourView] AS 
SELECT 
    [Group], 
    Product, 
    [Value], 
    CASE 
     WHEN (SUM([Value]) OVER (PARTITION BY [Group])) = 0 THEN 0 
     ELSE 1.0/(SUM([Value]) OVER (PARTITION BY [Group])) * [Value] END AS [Weight] 
FROM [YourTable] 
+0

如果某些羣組的總和(值)等於零,那該怎麼辦?我們如何防範這一點?例如在計算中過濾它們? – user7066213

+0

您可以使用CASE WHEN語句在執行除法之前檢查組合和是否爲0。我已經更新了我的答案中的CREATE VIEW語句以提供一個示例。當組的總和爲0時,我選擇將[Weight]作爲0返回,但您可以根據需要更改此值。 – dybzon

0
SELECT [group], SUM(weight) 
FROM table 
GROUP BY [group] 

在回答您的評論 - 當你查詢它,你可以創建一個視圖,將實時計算重量:

CREATE VIEW [dbo].[GroupWeights] 
AS 
SELECT [group], SUM(weight) 
FROM table 
GROUP BY [group] 

回答你的問題,最近編輯:

CREATE VIEW ProductWeights 
AS 
SELECT [p.group], product, value, (value/(SELECT SUM(value) FROM Products WHERE [group] = [p.group] GROUP BY [group])) AS [weight] 
FROM Products AS p 
+0

重列不存在。目標是創建權重列,即一個新的表格,將包含以前的列加上權重列 – user7066213

+0

@ user7066213請參閱我的編輯 – opewix

+0

請參閱我的編輯此答案不計算權重 – user7066213

0

您可以使用SELECT INTO與分區上創建新表和SUM通過組獲得總和如下:

Select [Group], Product, [Value], 
    [Weight] = ([Value]*1.0)/SUM([Value]) over(Partition by [Group]) 
    INTO NewTable from YourTable