我试图确定 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(员工、帐户、水果、分支、pcnt)值 (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 分组。但是,我不知道如何进行。任何帮助表示赞赏。