branch
従業員、アカウント、果物のサブセットに DD が存在する場合、AA、BB、CCに対する DD ( ) の割合を決定しようとしています。各従業員のpcnt
合計は 1 (100%) です。
分解すると、この計算は次の条件を満たす必要があります。
- DD のないサブセット (従業員、アカウント、果物) を無視する
| | 従業員 | アカウント | フルーツ | 支店 | PCNT | -------------------------------------------------- - | | 123 | フルーツ1 | りんご | AA | 0.1 |
- 完全に DD であるサブセット (従業員、アカウント、果物) を無視する
| | 従業員 | アカウント | フルーツ | 支店 | PCNT | -------------------------------------------------- - | | 123 | フルーツ2 | りんご | DD | 0.05 |
- DD をサブセット (従業員、アカウント、果物) 内の AA、BB、CC に比例して分配します。
から:
| | 従業員 | アカウント | フルーツ | 支店 | PCNT | -------------------------------------------------- - | | 123 | フルーツ1 | いちご | AA | 0.05 | | | 123 | フルーツ1 | いちご | BB | 0.02 | | | 123 | フルーツ1 | いちご | CC | CC | 0.07 | | | 123 | フルーツ1 | いちご | DD | 0.10 |
の中へ:
| | 従業員 | アカウント | フルーツ | 支店 | PCNT | -------------------------------------------------- - | | 123 | フルーツ1 | いちご | AA | 0.09 | | | 123 | フルーツ1 | いちご | BB | 0.03 | | | 123 | フルーツ1 | いちご | CC | CC | 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 になるはずです - 3 つすべて (AA、BB、CC) が存在しないサブセットがいくつかある場合があります。
テーブル構造
CREATE TABLE tbl ( 従業員 tinyint NOT NULL, アカウント varchar(10) NOT NULL, フルーツ varchar(15) NOT NULL, ブランチ char(2) NOT NULL, pcnt decimal(3,2) NULL PRIMARY KEY (従業員、アカウント、果物、支店))
サンプルデータ
INSERT INTO tbl (従業員、アカウント、果物、支店、pcnt) 値 (123, '果物1', 'りんご', 'AA', '0.1'), (123, 'フルーツ1', 'マンゴー', 'DD', '0.02'), (123, 'フルーツ1', 'マンゴー', 'CC', '0.1'), (123, 'フルーツ1', 'マンゴー', 'BB', '0.02'), (123, 'フルーツ1', 'マンゴー', 'AA', '0.06'), (123, 'フルーツ1', 'パイナップル', 'DD', '0.01'), (123, 'フルーツ1', 'パイナップル', 'CC', '0.05'), (123, 'フルーツ1', 'パイナップル', 'BB', '0.05'), (123, 'フルーツ1', 'パイナップル', 'AA', '0.05'), (123, 'フルーツ1', 'いちご', 'DD', '0.10'), (123, 'フルーツ1', 'いちご', 'CC', '0.07'), (123, 'フルーツ1', 'いちご', 'BB', '0.02'), (123, 'フルーツ1', 'いちご', 'AA', '0.05'), (123, 'フルーツ2', 'アップル', 'DD', '0.05'), (123, 'フルーツ2', 'マンゴー', 'DD', '0.01'), (123, 'フルーツ2', 'マンゴー', 'CC', '0.02'), (123, 'フルーツ2', 'マンゴー', 'BB', '0.01'), (123, 'フルーツ2', 'マンゴー', 'AA', '0.01'), (123, 'フルーツ2', 'パイナップル', 'DD', '0.02'), (123、「フルーツ 2」、「パイナップル」、「CC」、「0.03」)、 (123, 'フルーツ2', 'パイナップル', 'BB', '0.02'), (123, 'フルーツ2', 'パイナップル', 'AA', '0.02'), (123, 'フルーツ2', 'いちご', 'DD', '0.01'), (123, 'フルーツ2', 'いちご', 'CC', '0.05'), (123, 'フルーツ2', 'いちご', '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 をグループ化しました。しかし、どうすればいいのかわかりません。どんな助けでも大歓迎です。