Je tente de déterminer la proportion de DD (branch
) par rapport à AA, BB, CC où DD existe dans le sous-ensemble employé, compte, fruit. Le pcnt
de chaque employé s'ajoute à 1 (100%).Calcul de proportion avancé dans TSQL
Décomposant, ce calcul doit remplir les conditions suivantes:
- Ignore des sous-ensembles (employé, compte, fruits) sans DD
| EMPLOYEE | ACCOUNT | FRUIT | BRANCH | PCNT | --------------------------------------------------- | 123 | Fruit1 | Apple | AA | 0.1 |
- Ignore des sous-ensembles (employé, compte , fruit) qui sont entièrement DD
| EMPLOYEE | ACCOUNT | FRUIT | BRANCH | PCNT | --------------------------------------------------- | 123 | Fruit2 | Apple | DD | 0.05 |
- distribuer Proportionnellement DD sur AA, BB, CC au sein des sous-ensembles (employé, compte, fruits)
De:
| EMPLOYEE | ACCOUNT | FRUIT | BRANCH | PCNT | --------------------------------------------------- | 123 | Fruit1 | Strawberry | AA | 0.05 | | 123 | Fruit1 | Strawberry | BB | 0.02 | | 123 | Fruit1 | Strawberry | CC | 0.07 | | 123 | Fruit1 | Strawberry | DD | 0.10 |
en:
| EMPLOYEE | ACCOUNT | FRUIT | BRANCH | PCNT | --------------------------------------------------- | 123 | Fruit1 | Strawberry | AA | 0.09 | | 123 | Fruit1 | Strawberry | BB | 0.03 | | 123 | Fruit1 | Strawberry | CC | 0.12 |
Les calculs pour les proportions de sous-ensembles ci-dessus serait:
AA + {AA * [DD/(AA + BB + CC)]} 0.05 + {0.05 * [0.1/(0.05 + 0.02 + 0.07)]} = 0.09 0.02 + {0.02 * [0.1/(0.05 + 0.02 + 0.07)]} = 0.03 0.07 + {0.07 * [0.1/(0.05 + 0.02 + 0.07)]} = 0.12
- Après ces calculs et conditions, la somme des
pcnt
devrait être 1 - Il peut y avoir des sous-ensembles où tous trois (AA, BB, CC) sont présents
Tableau Structure
CREATE TABLE tbl ( employee tinyint NOT NULL, account varchar(10) NOT NULL, fruit varchar(15) NOT NULL, branch char(2) NOT NULL, pcnt decimal(3,2) NULL PRIMARY KEY (employee, account, fruit, branch))
données exemples
INSERT INTO tbl (employee, account, fruit, branch, pcnt) VALUES (123, 'Fruit1', 'Apple', 'AA', '0.1'), (123, 'Fruit1', 'Mango', 'DD', '0.02'), (123, 'Fruit1', 'Mango', 'CC', '0.1'), (123, 'Fruit1', 'Mango', 'BB', '0.02'), (123, 'Fruit1', 'Mango', 'AA', '0.06'), (123, 'Fruit1', 'Pineapple', 'DD', '0.01'), (123, 'Fruit1', 'Pineapple', 'CC', '0.05'), (123, 'Fruit1', 'Pineapple', 'BB', '0.05'), (123, 'Fruit1', 'Pineapple', 'AA', '0.05'), (123, 'Fruit1', 'Strawberry', 'DD', '0.10'), (123, 'Fruit1', 'Strawberry', 'CC', '0.07'), (123, 'Fruit1', 'Strawberry', 'BB', '0.02'), (123, 'Fruit1', 'Strawberry', 'AA', '0.05'), (123, 'Fruit2', 'Apple', 'DD', '0.05'), (123, 'Fruit2', 'Mango', 'DD', '0.01'), (123, 'Fruit2', 'Mango', 'CC', '0.02'), (123, 'Fruit2', 'Mango', 'BB', '0.01'), (123, 'Fruit2', 'Mango', 'AA', '0.01'), (123, 'Fruit2', 'Pineapple', 'DD', '0.02'), (123, 'Fruit2', 'Pineapple', 'CC', '0.03'), (123, 'Fruit2', 'Pineapple', 'BB', '0.02'), (123, 'Fruit2', 'Pineapple', 'AA', '0.02'), (123, 'Fruit2', 'Strawberry', 'DD', '0.01'), (123, 'Fruit2', 'Strawberry', 'CC', '0.05'), (123, 'Fruit2', 'Strawberry', 'AA', '0.05')
Ce que j'ai essayé
SELECT b.*,
CASE WHEN (b.Sum_AA + b.Sum_BB + b.Sum_CC) > 0 THEN 'hello'
ELSE NULL
END
FROM (
SELECT a.*,
(SELECT SUM(pcnt) AS [pcnt] FROM dbo.tbl
WHERE employee = a.employee AND account = a.account AND fruit = a.fruit
AND branch = 'AA') AS [Sum_AA],
(SELECT SUM(pcnt) AS [pcnt] FROM dbo.tbl
WHERE employee = a.employee AND account = a.account AND fruit = a.fruit
AND branch = 'BB') AS [Sum_BB],
(SELECT SUM(pcnt) AS [pcnt] FROM dbo.tbl
WHERE employee = a.employee AND account = a.account AND fruit = a.fruit
AND branch = 'CC') AS [Sum_CC]
FROM (
SELECT employee, account, fruit, SUM(pcnt) AS [Sum_DD]
FROM dbo.tbl
WHERE employee = 123 AND branch = 'DD'
GROUP BY employee, account, fruit) a) b
Jusqu'à la requête ci-dessus, j'ai regroupé AA, BB, CC. Cependant, je n'ai aucune idée de comment procéder. Toute aide est appréciée.
Je pense que vous l'avez fait. Je vous remercie. – Kermit