разделить счет между членами группы - PullRequest
0 голосов
/ 04 марта 2020

У меня есть SQL результат, который выглядит следующим образом:

+-----------+------------+
| AGENTCODE |  DEAL_ID   |
+-----------+------------+
|    110434 | SO20001353 |
|    108415 | SO20001344 |
|    106188 | SO20001344 |
|    107689 | SO20001342 |
|    109150 | SO20001340 |
|    109150 | SO20001341 |
+-----------+------------+

Если я группирую по коду агента и рассчитываю deal_id Я получаю количество сделок на агента,
логически для меня Если в сделке более одного агента, то каждый должен получить 1 / агентов за эту сделку. Это опция для SQL или мне нужно написать программу для этого?

Мой желаемый результат будет выглядеть так:

+-----------+-------+
| AGENTCODE | DELAS |
+-----------+-------+
|    110434 |     1 |
|    108415 |   0.5 |
|    106188 |   0.5 |
|    107689 |     1 |
|    109150 |     2 |
+-----------+-------+

Спасибо.

Текущий код

SELECT d.AGENTCODE,
       SUM(c.DEAL_COUNT) AS DEALS
FROM (
         SELECT AGENTS.AGENTCODE,
                ORDERS.ORD
         FROM AGENTS,
              BRANCHES,
              CPROFTYPES,
              ORDERS,
              ORDSTATUS,
              ORDERITEMS,
              TRANSPAYMENT,
              TRANSORDER
         WHERE ORDERITEMS.EPI_AGENT = AGENTS.AGENT
           AND ORDERITEMS.PART = 25 /*5003*/
           AND ORDERS.ORD = ORDERITEMS.ORD
           AND ORDERS.BRANCH = BRANCHES.BRANCH
           AND ORDERS.ORDTYPE = CPROFTYPES.CPROFTYPE
           AND TRANSORDER.EPI_PAYDATE BETWEEN 16830720 AND 16917120
           AND ORDERS.ORDSTATUS = ORDSTATUS.ORDSTATUS
           AND ORDSTATUS.ORDSTATUSDES != 'canceled'
           AND TRANSPAYMENT.ORD = ORDERS.ORD
           AND TRANSPAYMENT.TRANS = TRANSORDER.TRANS
           AND TRANSORDER.EPI_CKPAY = 'Y'
           AND TRANSORDER.TRANS != 0
           AND NOT EXISTS(SELECT 'X'
                          FROM TRANSPAYMENT TRP
                             , TRANSORDER TRS
                          WHERE TRP.ORD = ORDERS.ORD
                            AND TRP.TRANS = TRS.TRANS
                            AND TRS.EPI_PAYDATE
                              > 16917120
                            AND TRS.TRANS != 0)
           AND CPROFTYPES.TYPECODE IN ('21', '22', '26', '29')
     ) AS d
         CROSS APPLY (SELECT 1.00 / COUNT(*) AS DEAL_COUNT FROM ORDERS WHERE ORD = d.ORD) c
GROUP BY d.AGENTCODE
ORDER BY d.AGENTCODE;

Ответы [ 2 ]

0 голосов
/ 04 марта 2020
  select AGENTCODE,   
     COUNT(AGENTCODE ) OVER (PARTITION  BY  DEAL_ID) * 1.00  / COUNT( DEAL_ID) OVER (PARTITION  BY   AGENTCODE) * 1.00  AS DELAS 
  FROM Data; 

Демо: https://rextester.com/ENK8799

Результат:

    AGENTCODE   DEAL_ID
1   110434  SO20001353
2   108415  SO20001344
3   106188  SO20001344
4   107689  SO20001342
5   109150  SO20001340
6   109150  SO20001341

    AGENTCODE   DELAS
1   106188  2,000000000000000
2   107689  1,000000000000000
3   108415  2,000000000000000
4   109150  0,500000000000000
5   109150  0,500000000000000
6   110434  1,000000000000000
0 голосов
/ 04 марта 2020

Один из возможных подходов:

Таблица:

CREATE TABLE Data (
    AGENTCODE int,
    DEAL_ID varchar(10)
)
INSERT INTO Data
    (AGENTCODE, DEAL_ID)
VALUES
    (110434, 'SO20001353'),
    (108415, 'SO20001344'),
    (106188, 'SO20001344'),
    (107689, 'SO20001342'),
    (109150, 'SO20001340'),
    (109150, 'SO20001341')

Заявление:

SELECT d.AGENTCODE, SUM(c.DEAL_COUNT) AS DEAL_COUNT
FROM Data d
CROSS APPLY (SELECT 1.00 / COUNT(*) AS DEAL_COUNT FROM Data WHERE DEAL_ID = d.DEAL_ID) c
GROUP BY d.AGENTCODE
ORDER BY d.AGENTCODE

Результат:

AGENTCODE  DEAL_COUNT
106188     0.5000000000000
107689     1.0000000000000
108415     0.5000000000000
109150     2.0000000000000
110434     1.0000000000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...