2

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
  • これらの計算と条件の後、合計はpcnt1 になるはずです
  • 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 をグループ化しました。しかし、どうすればいいのかわかりません。どんな助けでも大歓迎です。

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 に答える