我有一个如下所示的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;
一种可能的方法:
表格:
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
声明,根据您更新的问题:
SELECT d.AGENTCODE, SUM(c.DEAL_COUNT) AS DEAL_COUNT
FROM (
SELECT *
FROM AGENTS,
BRANCHES,
CPROFTYPES,
ORDERS,
ORDSTATUS,
ORDERITEMS,
TRANSPAYMENT,
TRANSORDER
WHERE
ORDERITEMS.EPI_AGENT = AGENTS.AGENT
AND ORDERITEMS.PART = 25 /*5003*/
...
) 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
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