2

我试图确定 DD ( branch) 与 AA、BB、CC 的比例,其中 DD 存在于员工、帐户、水果的子集中。每个员工的pcnt加成为 1 (100%)。

分解它,这个计算必须满足以下条件:

  • 忽略没有 DD 的子集(员工、帐户、水果)
| 员工 | 帐户 | 水果 | 分行 | 碳纳米管 |
-------------------------------------------------- -
| 123 | 水果1 | 苹果 | 机管局 | 0.1 |
  • 忽略完全 DD 的子集(员工、帐户、水果)
| 员工 | 帐户 | 水果 | 分行 | 碳纳米管 |
-------------------------------------------------- -
| 123 | 水果2 | 苹果 | DD | 0.05 |
  • 在子集(员工、帐户、水果)内按比例分配 DD 到 AA、BB、CC

从:

| 员工 | 帐户 | 水果 | 分行 | 碳纳米管 |
-------------------------------------------------- -
| 123 | 水果1 | 草莓 | 机管局 | 0.05 |
| 123 | 水果1 | 草莓 | BB | 0.02 |
| 123 | 水果1 | 草莓 | 抄送 | 0.07 |
| 123 | 水果1 | 草莓 | DD | 0.10 |

进入:

| 员工 | 帐户 | 水果 | 分行 | 碳纳米管 |
-------------------------------------------------- -
| 123 | 水果1 | 草莓 | 机管局 | 0.09 |
| 123 | 水果1 | 草莓 | BB | 0.03 |
| 123 | 水果1 | 草莓 | 抄送 | 0.12 |

上述子集比例的计算将是:

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
  • 经过这些计算和条件,总和pcnt应该是1
  • 可能有一些子集不是所有三个(AA、BB、CC)都存在

表结构

创建表 tbl (
  员工 tinyint 非空,
  帐户 varchar(10) 非空,
  水果 varchar(15) 非空,
  分支 char(2) NOT NULL,
  pcnt 十进制 (3,2) NULL
  主键(员工、账户、水果、分支))

样本数据

INSERT INTO tbl(员工、帐户、水果、分支、p​​cnt)值
(123, 'Fruit1', 'Apple', 'AA', '0.1'),
(123, 'Fruit1', '芒果', 'DD', '0.02'),
(123, 'Fruit1', '芒果', 'CC', '0.1'),
(123,'Fruit1','芒果','BB','0.02'),
(123, 'Fruit1', '芒果', 'AA', '0.06'),
(123, 'Fruit1', '菠萝', 'DD', '0.01'),
(123, 'Fruit1', '菠萝', 'CC', '0.05'),
(123, 'Fruit1', '菠萝', 'BB', '0.05'),
(123, 'Fruit1', '菠萝', 'AA', '0.05'),
(123, 'Fruit1', '草莓', 'DD', '0.10'),
(123, 'Fruit1', '草莓', 'CC', '0.07'),
(123, 'Fruit1', '草莓', 'BB', '0.02'),
(123, 'Fruit1', '草莓', 'AA', '0.05'),
(123,'Fruit2','Apple','DD','0.05'),
(123,'Fruit2','芒果','DD','0.01'),
(123, 'Fruit2', '芒果', 'CC', '0.02'),
(123, 'Fruit2', '芒果', 'BB', '0.01'),
(123, 'Fruit2', '芒果', 'AA', '0.01'),
(123,'Fruit2','菠萝','DD','0.02'),
(123, 'Fruit2', '菠萝', 'CC', '0.03'),
(123, 'Fruit2', '菠萝', 'BB', '0.02'),
(123, 'Fruit2', '菠萝', 'AA', '0.02'),
(123, 'Fruit2', '草莓', 'DD', '0.01'),
(123, 'Fruit2', '草莓', 'CC', '0.05'),
(123, 'Fruit2', '草莓', 'AA', '0.05')

我试过的

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

直到上面的查询,我已经将 AA、BB、CC 分组。但是,我不知道如何进行。任何帮助表示赞赏。

4

1 回答 1

1

不确定这是不是你需要的,试试这个。

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'  
于 2012-07-31T17:25:24.717 回答