2012-07-31 3 views
2

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.

Répondre

1

Vous ne savez pas si c'est ce dont vous avez besoin, essayez ceci.

WITH ct1 AS 
(  
    SELECT employee, account, fruit 
     ,SUM(CASE WHEN branch = 'AA' THEN pcnt ELSE 0 END) AS AA  
     ,SUM(CASE WHEN branch = 'BB' THEN pcnt ELSE 0 END) AS BB  
     ,SUM(CASE WHEN branch = 'CC' THEN pcnt ELSE 0 END) AS CC 
     ,SUM(CASE WHEN branch = 'DD' THEN pcnt ELSE 0 END) AS DD 
    FROM tbl 
    GROUP BY employee, account, fruit having SUM(CASE WHEN branch = 'DD' THEN 1 ELSE 0 END) >= 1  
) 
SELECT t.* 
    ,new_pcnt = t.pcnt + ROUND((t.pcnt * (DD /(AA + BB + CC))),2) 
FROM tbl t 
INNER JOIN ct1 
    ON t.employee = ct1.employee 
    AND t.account = ct1.account 
    AND t.fruit = ct1.fruit 
WHERE t.branch <> 'DD' 
+0

Je pense que vous l'avez fait. Je vous remercie. – Kermit