2017-07-16 1 views
0

Je souhaite calculer des poids dans des groupes. Dites que j'ai une table comme celle-ci avec une variable de groupe et je veux calculer la colonne de poids qui est la valeur du produit sur la somme de toutes les valeurs de produits dans ce groupe. Comment cela peut-il être fait?Calcul Transact SQL dans le groupe

Exemple de données:

Je veux aller de ce tableau:

Original Table

à cette table:

Table I want to create

Cela signifie que la colonne de poids n'existe pas. L'objectif est de créer une nouvelle table contenant toutes les colonnes d'origine et une nouvelle colonne appelée weight.

Exemple de calcul du poids: Pour le produit de la ligne 5 du groupe B x le poids est calculé en poids = 10/40.

Répondre

1

Vous pouvez utiliser une fonction de fenêtre pour y parvenir. Voici un exemple:

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

Je vous suggère de créer une vue sur le dessus de votre table existante (en fonction de vos besoins, bien sûr). Vous pouvez créer votre point de vue comme ceci:

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

Que se passe-t-il si, pour certains groupes, la somme (valeur) est égale à zéro? Comment pouvons-nous nous protéger contre cela? par exemple. les filtrer dans le calcul? – user7066213

+0

Vous pouvez utiliser une instruction CASE WHEN pour vérifier si la somme du groupe est 0 avant d'effectuer la division. J'ai mis à jour l'instruction CREATE VIEW dans ma réponse pour fournir un exemple à ce sujet. J'ai choisi de retourner 0 comme [Poids] lorsque la somme pour le groupe est 0, mais vous pouvez changer cela en fonction de vos besoins. – dybzon

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

En réponse à votre commentaire - vous pouvez créer une vue qui calcule le poids à la volée lorsque vous interrogez-le:

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

réponse pour les modifications récentes dans votre question:

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

La colonne de poids n'existe pas. Le but est de créer la colonne de poids à savoir une nouvelle table qui contiendra les colonnes précédentes plus la colonne de poids – user7066213

+0

@ user7066213 s'il vous plaît voir mes modifications – opewix

+0

s'il vous plaît voir mes modifications cette réponse ne calcule pas les poids – user7066213

0

Vous pouvez utiliser SELECT INTO pour créer une nouvelle table et SUM avec partition pour obtenir la somme par le groupe comme ci-dessous:

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